{
  "reference": "Filtered SHS-code-review.zip only; not a complete original project or live verification",
  "end_target": "One maintained white-label product matching the useful public website, customer portal and staff/admin PWA purposes and workflows; documented improvements preserve purpose.",
  "prototype_release": "0.25.0",
  "source_file_count": 275,
  "backend_declared_route_count": 283,
  "frontend_route_count": 19,
  "nested_ui_action_count": 217,
  "parse_errors": [],
  "capabilities": [
    {
      "id": "WEB01",
      "capability": "Public home, about, service pages and enquiry journey",
      "source_evidence": [
        "frontend/src/App.js",
        "frontend/src/pages/LandingPage.jsx",
        "frontend/src/pages/ServicePage.jsx",
        "frontend/src/pages/EnquiryPage.jsx",
        "backend/models.py",
        "backend/routers/enquiries.py",
        "backend/routers/files.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "v0.20 version-specific client, render, backend and recovery evidence: enquiry-format-milestone-checks.json and test-results-v0.20.xml. Earlier version-specific evidence remains historical.",
      "ui_verified_status": "v0.19 anonymous optional-date and zero/five-photo enquiries saved, validation retained inputs, and owner/fresh-tab reopening showed original facts and five private decoded images. Matching contacts stayed separate. A later external v0.19 Browser-Closeout record completed second-business sign-in and tab cleanup; API denials passed. The v0.19.1 final bundle passed eleven additional workflow groups; selected-file controls and old QA-tab cleanup remain unverified.",
      "remaining_gaps_and_decisions": "v0.20 private PNG/JPEG/WebP/HEVC-HEIF still intake uses five files at 10 MiB each / 50 MiB total; browser picker and real-phone proof pending. Explicit 12 MP/12000-side, sequence/multi-main-image/AVIF/other-codec gaps remain. Full route/content parity, gallery journey, devices and production remain open.",
      "next_stage": "Complete picker/device checks only when supported control changes; continue the separately tracked gallery and wider parity journeys.",
      "format_size_axes": {
        "source_evidence": "enquiry-format-source-map.json; original main route 10485760 bytes, UI five files; no explicit original aggregate bound; legacy fallback differs",
        "implementation": "HEVC-coded HEIC/HEIF still plus PNG/JPEG/WebP, five times 10 MiB, private atomic intake, supervised content decoder",
        "automated": "Version-specific synthetic encoded, size/resource/failure/retry/privacy and recovery checks; see enquiry-format-milestone-checks.json",
        "ui": "New-format picker/preview/removal/submit/reopen and real-phone proof UNVERIFIED; no browser-seeded upload claim",
        "integration": "Local decoder only; native deployment packaging, licence obligations and production resource/load policy remain",
        "missing": "Higher pixel counts, sequences, multiple main images, AVIF and untested codecs/phone/HDR variants remain explicit gaps",
        "decision": "Commercial native dependency distribution, production storage policy and future broader format/pixel support remain; local bounded choices documented"
      }
    },
    {
      "id": "WEB02",
      "capability": "Website content editing, rich text, branding, navigation and publication",
      "source_evidence": [
        "frontend/src/components/admin/SiteEditorTab.jsx",
        "frontend/src/components/admin/RichTextEditor.jsx",
        "backend/routers/site_editor.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_websites.py; tests/test_boundaries.py; tests/test_documents.py; tests/test_recovery.py; frontend/src/site-rules.test.js; frontend/src/portal-session.test.js; website-journey-milestone-checks.json",
      "ui_verified_status": "v0.18 branding/logo/colours, page/service/menu edits, save/reopen, private preview, publish, hide, history-to-draft, explicit republish, stale save and bounded leave modal verified. Preview and other owner window clear after same-origin sign-out.",
      "remaining_gaps_and_decisions": "One structured maintained layout with distinct saved draft/publication, private images and version history. Safe typed sections replace executable HTML. Rich formatting, themes, redirects, wider section/order/gallery cases and general owner expiry/device behaviour remain.",
      "next_stage": "Gallery and job-photo permission/publication journey; broader editor/accessibility checks"
    },
    {
      "id": "WEB03",
      "capability": "Gallery collections, service galleries, captions and public media",
      "source_evidence": [
        "frontend/src/pages/GalleryIndexPage.jsx",
        "frontend/src/pages/GalleryDetailPage.jsx",
        "backend/routers/portfolio.py",
        "backend/routers/site_editor.py:193-437",
        "backend/routers/seo.py:69-113",
        "backend/storage.py:79-119"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_photos.py; full prior regression suites; frontend/src/photo-rules.test.js; frontend/src/api.test.js v0.20.1: 41 selected photo/format recovery regressions, 167 client tests including 11 private-gallery access regressions, 88 structural render cases, build and saved-browser-data recovery passed.",
      "ui_verified_status": "v0.20.1 actual Chrome: owner private photo edit/validation/review, separate customer share/unshare, exact-job public draft, validation/permission, index/detail/service/lightbox, stale save retention, draft/public split, withdrawal, archive/restore, history-to-draft, re-review and republication. Private preview sign-out text/viewer leak repaired and retested; foreign-business preview denied. API-seeded source photos are not browser upload proof. Staff/customer portal browser branches remain unverified.",
      "remaining_gaps_and_decisions": "Separately authored project drafts, reviewed photos/library selections, page URLs, categories/order, before-after pairs, public index/detail/related projects/service associations, escaped metadata, publish/withdraw/history-to-draft are implemented. Current-publication-only image routes stop new reads after withdrawal; historical images remain private. All local pages stay noindex. No raw HTML, automatic copy or generated copy; visual/accessibility/phone/crawler verification and production publishing remain. Actual new-format picker and selected-file controls, staff/customer browser journeys, related/multiple-project and website-library browser cases, GIF/TIFF/BMP and other format/device/offline/source parity gaps remain open, not agreed exclusions. Withdrawal returns a plain JSON 404; branded handling remains a usability improvement.",
      "next_stage": "Resolve documented upload/browser capability gap without repeated security-setting probes; then complete staff/customer and mobile/PWA/media parity with separate evidence. No new credentialed accounts as a browser workaround."
    },
    {
      "id": "WEB04",
      "capability": "Feedback requests, ratings, moderation and approved public reviews",
      "source_evidence": [
        "frontend/src/pages/FeedbackPage.jsx",
        "frontend/src/pages/ReviewsPage.jsx",
        "frontend/src/components/admin/FeedbackTab.jsx",
        "backend/routers/feedback.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "611 backend cases including feedback/workflow/strict recovery regressions; 101 client cases including 7 new feedback access checks; 79 structural renders/build. See feedback-journey-milestone-checks.json.",
      "ui_verified_status": "v0.17 exact matching-contact requests, private answers/default-off permission, customer preview/replacement, deliberate owner publication, withdrawal/stale rejection, harmless metadata preservation, material contact suspension, renewed access, history/reload and 689px keyboard panel verified. Revoked-view clearing and owner-list refresh repaired and retested.",
      "remaining_gaps_and_decisions": "Local feedback core is browser-verified within the bounded three-response journey; original answers and exact permission lineage survive recovery, with old access invalidated and publications hidden. Customer code view intentionally omits job/contact details; owner/saved/API binding checked. Broader expiry/archive/portal feedback/theme/history/device cases remain. Real delivery/identity, external/manual review imports, retention/legal policy and production wording/hosting remain open. Original R06 remains OPEN.",
      "next_stage": "Editable website-to-public-enquiry journey; remaining feedback device/delivery/policy checks later"
    },
    {
      "id": "WEB05",
      "capability": "SEO, social previews, sitemap, legal/privacy/cookie pages and consent",
      "source_evidence": [
        "backend/routers/seo.py",
        "frontend/src/pages/PrivacyPolicy.jsx",
        "frontend/src/pages/TermsConditions.jsx",
        "frontend/src/pages/CookiePolicy.jsx"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_websites.py; tests/test_boundaries.py; tests/test_documents.py; tests/test_recovery.py; frontend/src/site-rules.test.js; frontend/src/portal-session.test.js; website-journey-milestone-checks.json",
      "ui_verified_status": "v0.18 draft/private metadata separation, published canonical/robots/sitemap and real 404 verified by HTTP/API; branded missing page also observed in browser.",
      "remaining_gaps_and_decisions": "Published-only metadata/sitemaps and local noindex remain. Private draft metadata is excluded. Owner legal placeholders remain unpublished; real reviewed policies/consent, structured data, production origins/domains and actual crawler/device validation remain. No tracking or embeds installed.",
      "next_stage": "Retain production metadata/policy gates and wider layout checks"
    },
    {
      "id": "JOB01",
      "capability": "Enquiries, pipeline, stages, priorities/tags, dates, private notes and next actions",
      "source_evidence": [
        "frontend/src/components/admin/JobsTab.jsx",
        "frontend/src/components/admin/PipelineTab.jsx",
        "backend/routers/enquiries.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "521 full backend cases; tests/test_workflow.py and tests/test_workflow_recovery.py; 85 client tests; 53 structural render cases. See workflow-milestone-checks.json. v0.19.1: 26 new draft/leave-controller cases (151 client total), 88 structural renders and 36 selected backend regressions; leave-guard-milestone-checks.json.",
      "ui_verified_status": "v0.13 save/reload, combined filters/counts, private metadata, exact IDs, stale-save draft retention and 689px keyboard navigation verified. Wider job/staff/mobile flows remain. v0.16 direct-invoice-only linked-document empty state repaired and verified. v0.19.1 clean open/history/sign-out, reversion/equivalent tags, 422/409 retention, corrected save/reopen, one explicit discard logout and quote Keep editing passed in private QA. Final-bundle quote, Materials, time, photo-text, customer-review and enquiry draft/save-lock checks passed. Selected-file controls and old QA-tab cleanup remain unverified.",
      "remaining_gaps_and_decisions": "Adds versioned priority/tags, next action/dates, contact/completion dates, private notes, guarded archive and retained workflow history. Search/filter counts describe exact matches. Job stage stays separate from documents/payments; old unknown completion dates stay unknown. Wider bulk pipeline controls and full field/staff/device parity remain. Final-bundle nested draft and save locks have browser evidence except selected-file retention/Clear/discard; QA-tab cleanup remains pending.",
      "next_stage": "Selected-file controls and old QA-tab cleanup remain unverified; v0.20 photo formats are a separate authorised stage."
    },
    {
      "id": "CUS01",
      "capability": "Customer search/create/edit/reuse, exact-ID history and job links",
      "source_evidence": [
        "frontend/src/components/admin/CustomersTab.jsx",
        "frontend/src/components/admin/CustomerTimeline.jsx",
        "backend/routers/customers.py",
        "backend/routers/project.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core; broader verification remains",
      "automated_test_status": "560 backend tests; tests/test_customer_reviews.py and test_customer_recovery.py; 90 client tests; 65 render cases. See customer-milestone-checks.json.",
      "ui_verified_status": "v0.14 note save, Keep editing, exact history, filtered export button, reopened original/retained documents and unchanged balances verified. Download file bytes and broader customer UI remain.",
      "remaining_gaps_and_decisions": "Adds state/search views, owner-private notes, consolidated exact history and bounded formula-safe CSV. Archive/restore guards preserve evidence and revoke permissions. No generic customer import, deletion or accounting reconciliation; larger datasets and broader UI remain.",
      "next_stage": "Broader customer UI and assisted trial"
    },
    {
      "id": "CUS02",
      "capability": "Duplicate detection, review, merge, reassignment and backfill",
      "source_evidence": [
        "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
        "backend/routers/customer_duplicates.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Guarded exact-merge separation and repeated selected-job corrections implemented locally; wider duplicate/import parity remains partial",
      "automated_test_status": "v0.25: 822 full backend cases (48 merge-separation cases), 210 client tests, 11 separation +7 previous correction +18 note actual React DOM interactions, 90 structural renders and build pass. Genuine format13 migration, strict format14 recovery and extracted-package proof are separate evidence. No native browser claim. See merge-correction-checks.json.",
      "ui_verified_status": "v0.14 keep-separate decision, exact merge and evidenced completion-date review saved; retained alias and date reopened. Selected-job, stale/conflict and re-invitation UI remain.",
      "remaining_gaps_and_decisions": "Exact saved-merge review can reactivate its original unchanged alias and append explicitly selected eligible return moves. All original jobs, later owners, excluded and unrelated retained work remain visible. Contact restoration is explicit per field and blocked by a later different value. Both accounts/sharing are revoked; old recurrence, follow-up and device-note scopes do not return. Format14 retains original merge evidence and migrates genuine format13 with pinned old validators. Mixed invalid batches and stale access/work are atomic rejections. Transitive whole-customer separation, arbitrary unmerge/import/generic backfill/deletion, larger datasets and wider browser/device/live approval remain open.",
      "next_stage": "Independent package review, then a separately authorised native owner/phone walkthrough of the bounded merge correction. No sign-in permission is requested or inferred by this automated stage."
    },
    {
      "id": "DOC01",
      "capability": "Draft quotes, line items, fractional quantities, notes and validity dates",
      "source_evidence": [
        "frontend/src/components/admin/QuotesInvoicesTab.jsx",
        "frontend/src/components/admin/DashboardDialogs.jsx",
        "backend/server.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_documents.py; tests/test_boundaries.py; tests/test_recovery.py",
      "ui_verified_status": "v0.12.1 simple owner private draft save/reload verified; wider document editor states pending.",
      "remaining_gaps_and_decisions": "Versioned draft editing, fractional quantities (3 decimals), per-line half-up pence and subtotal VAT arithmetic; dates and notes. Source pricing assistance and all formatting/options remain to compare.",
      "next_stage": "Document milestone"
    },
    {
      "id": "DOC02",
      "capability": "Quote share/accept, revisions, supersession, cancellation and history",
      "source_evidence": [
        "frontend/src/components/admin/QuotesInvoicesTab.jsx",
        "backend/server.py",
        "backend/routers/portal.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_portal_access.py; tests/test_private_pdf.py; tests/test_portal_recovery.py; full prior regressions; frontend/src/portal-rules.test.js; frontend/src/api.test.js; server render and PDF artifact QA (no browser)",
      "ui_verified_status": "v0.12.1 owner share, customer accept/decline, reload/history, owner revision and stale-response rejection verified; expiry/cancellation/wider controls pending.",
      "remaining_gaps_and_decisions": "Exact current shared quote accept/decline records snapshot, version, actor, time, saved wording and optional acknowledgement. Expired, stale, superseded and concurrent responses are guarded. Source reservations survive decline until owner revision/cancellation. Typed names are a local extension, not certified signatures. Real legal wording, delivery and browser checks remain.",
      "next_stage": "Portal UI rehearsal; delivery later"
    },
    {
      "id": "DOC03",
      "capability": "Invoice drafts, direct job invoices, accepted-quote conversion, issue and due dates",
      "source_evidence": [
        "frontend/src/components/admin/QuotesInvoicesTab.jsx",
        "backend/server.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_documents.py; tests/test_boundaries.py; tests/test_recovery.py",
      "ui_verified_status": "v0.16 source-reviewed direct invoice draft, reopen, explicit issue and restart verified. Accepted-quote/stage alternatives retain earlier evidence and wider gaps.",
      "remaining_gaps_and_decisions": "Private drafts require explicit local issue. Issued content is sealed. Existing v0.4 invoices migrate as issued with portal access and receipts retained. Real invoice/VAT settings remain a release gate.",
      "next_stage": "Document milestone"
    },
    {
      "id": "DOC04",
      "capability": "Payments, methods/dates, allocation, partial balances and status",
      "source_evidence": [
        "backend/server.py",
        "backend/routers/payment_schedule.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_documents.py; tests/test_boundaries.py; tests/test_recovery.py",
      "ui_verified_status": "v0.16 invented GBP 20 manual receipt against GBP 46 invoice gives GBP 26 balance after reload/restart/restore. No bank or payment integration.",
      "remaining_gaps_and_decisions": "One integer-pence receipt ledger; retries/concurrency and allocations are tested. No charges, bank reconciliation or money movement. Job operational stage remains separate.",
      "next_stage": "Document milestone"
    },
    {
      "id": "DOC05",
      "capability": "Deposit and multi-stage payment plans, requests, printing and stage status",
      "source_evidence": [
        "frontend/src/components/admin/PaymentScheduleEditor.jsx",
        "backend/routers/payment_schedule.py",
        "frontend/src/components/admin/QuotesInvoicesTab.jsx"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_documents.py; tests/test_boundaries.py; tests/test_recovery.py",
      "ui_verified_status": "v0.5 UI pending",
      "remaining_gaps_and_decisions": "Percentage deposit helper, fixed stages, due dates, local requests and ledger-derived status work. Requests add no invoice/revenue. Plans lock after request/receipt; negotiated replanning and automated reminders are missing.",
      "next_stage": "Document milestone; reminders/replanning"
    },
    {
      "id": "DOC06",
      "capability": "Cancellation, void, invoice replacement, payment-record correction, credits/refunds",
      "source_evidence": [
        "backend/server.py",
        "frontend/src/components/admin/QuotesInvoicesTab.jsx"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_documents.py; tests/test_boundaries.py; tests/test_recovery.py",
      "ui_verified_status": "v0.5 UI pending",
      "remaining_gaps_and_decisions": "Reasoned cancellation/void and unpaid replacement preserve originals. Mistaken receipt reversal/replacement is atomic and audited. Real credit notes, refunds, chargebacks and settlement policy remain unresolved; paid invoices cannot simply be voided.",
      "next_stage": "Document milestone; accounting policy decision"
    },
    {
      "id": "DOC07",
      "capability": "Unique numbering, private document views, PDF/print, delivery and reference rules",
      "source_evidence": [
        "backend/server.py",
        "frontend/src/components/admin/QuotesInvoicesTab.jsx"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_portal_access.py; tests/test_private_pdf.py; tests/test_portal_recovery.py; full prior regressions; frontend/src/portal-rules.test.js; frontend/src/api.test.js; server render and PDF artifact QA (no browser)",
      "ui_verified_status": "Prior owner/accepted-quote downloads retained. v0.16 actual owner download of customer-facing invoice PDF retrieved, rendered and privacy checked. Customer invoice/stage downloads and browser print remain.",
      "remaining_gaps_and_decisions": "Private authenticated in-memory PDFs retain exact-pence snapshots and historical logos with a separate current status/balance summary. Sealed stage requests are not additional invoices. Configurable prefixes/year and non-resetting counters preserve references. Real delivery, certified signatures, browser/mobile layouts and wider localisation remain.",
      "next_stage": "Document UI rehearsal; delivery later"
    },
    {
      "id": "DOC08",
      "capability": "Invoice bulk upload, OCR, bulk dates, historical rename and material extraction",
      "source_evidence": [
        "frontend/src/components/admin/InvoiceBulkUpload.jsx",
        "frontend/src/components/admin/InvoiceBulkDates.jsx",
        "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
        "backend/routers/invoice_ocr.py",
        "backend/routers/material_extraction.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Integration-dependent / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "No OCR/AI/storage calls. Preserve review, rollback and provenance requirements; SHS historical cut-offs must become configuration or an explicit product decision.",
      "next_stage": "Import and extraction stage"
    },
    {
      "id": "DOC09",
      "capability": "Suggested lines and invoice generation from jobs, time, materials or field logs",
      "source_evidence": [
        "frontend/src/components/admin/ProjectCommandCenter.jsx",
        "backend/routers/project.py",
        "backend/routers/site_mode.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_fieldwork.py; tests/test_field_recovery.py; full prior regression suites; frontend/src/field-rules.test.js; scripts/check-client-render.mjs (server render only)",
      "ui_verified_status": "v0.16 explicit blank-to-priced field/material sources, private draft, save refresh, duplicate reservation denial and issued source history verified.",
      "remaining_gaps_and_decisions": "Exact-job field/manual-time/received-material suggestions; explicit customer prices; whole-source reservations; private drafts with sourced/manual lines; stale-source review; revision, invoice/replacement transfers and cancel/void release are implemented and tested. No automatic issue/send. Partial-source billing, equivalent manual-charge detection, paid credits/refunds and full interactive checks remain.",
      "next_stage": "Broader source correction and paid-credit policies; staff/photo flows"
    },
    {
      "id": "MAT01",
      "capability": "Job materials tracker, fractional quantities, stages/dates, archive and bulk actions",
      "source_evidence": [
        "frontend/src/components/admin/MaterialsTab.jsx",
        "frontend/src/components/admin/JobMaterialsPanel.jsx",
        "backend/routers/materials.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "See docs/VERIFICATION.md for the limited implemented portion",
      "ui_verified_status": "Historical v0.2 desktop; v0.12.1 saved job snapshot, reload/reopen and unchanged close verified. Other tracker controls not repeated. v0.16 received material saved through UI and included once in reviewed invoice sources.",
      "remaining_gaps_and_decisions": "Manual tracker, job panel, historical scope and stage summaries tested. External extraction/backfill remains missing.",
      "next_stage": "Retain and regression-test"
    },
    {
      "id": "MAT02",
      "capability": "Reusable catalogue, supplier/SKU/default prices and saved job snapshots",
      "source_evidence": [
        "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
        "frontend/src/components/admin/CataloguePicker.jsx",
        "backend/routers/materials_catalogue.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "See docs/VERIFICATION.md for the limited implemented portion",
      "ui_verified_status": "v0.12.1 visible create/edit, real dirty warning, Keep editing, rejected-save retention, saved prices/reload and add-to-job verified.",
      "remaining_gaps_and_decisions": "Versioned catalogue, archive/history and snapshots tested. Charge reference never silently feeds billing.",
      "next_stage": "Retain and regression-test"
    },
    {
      "id": "MAT03",
      "capability": "Supplier references, prices/dates, reviewed CSV import and supplier order export",
      "source_evidence": [
        "frontend/src/components/admin/MaterialsCsvImport.jsx",
        "frontend/src/components/admin/MaterialsTab.jsx",
        "backend/routers/materials.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "See docs/VERIFICATION.md for the limited implemented portion",
      "ui_verified_status": "v0.2 paste/preview and private order view",
      "remaining_gaps_and_decisions": "Manual links and cost-free printable order view work. File chooser, real print/PDF and direct PDF generation remain unverified/missing.",
      "next_stage": "Materials completion"
    },
    {
      "id": "TIME01",
      "capability": "Manual time, internal rate snapshots, correction/history and job cost views",
      "source_evidence": [
        "frontend/src/components/admin/JobTimePanel.jsx",
        "frontend/src/components/admin/InvoiceProfitabilityWidget.jsx",
        "backend/routers/time_entries.py",
        "backend/routers/project.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_fieldwork.py; tests/test_field_recovery.py; full prior regression suites; frontend/src/field-rules.test.js; scripts/check-client-render.mjs (server render only)",
      "ui_verified_status": "Prior manual checks retained. v0.16 real short capture, reasoned fictional correction, one saved-rate conversion, accurate labour-origin controls and GBP 22.50 work-cost view verified.",
      "remaining_gaps_and_decisions": "Manual time plus owner-reviewed field conversions use saved resources/rates, London-date half-up minutes, active-generation links, capacity checks and correction history. Internal costs remain separate from customer prices; field source cannot also be billed as its generated time entries. Payroll, overhead/VAT/accounting profit, semantic duplicate manual time and broader UI rehearsal remain.",
      "next_stage": "Staff/two-person and correction UI; retain cost-policy gaps"
    },
    {
      "id": "CAL01",
      "capability": "Day/week/team bookings, multi-day work, unavailable time and conflicts",
      "source_evidence": [
        "frontend/src/components/admin/CalendarSection.jsx",
        "backend/routers/calendar.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_recurrence.py; tests/test_recurrence_recovery.py; tests/test_scheduling.py; full prior regression suites; frontend/src/recurrence-rules.test.js; scripts/check-client-render.mjs (server render only)",
      "ui_verified_status": "v0.3 selected manual flows; v0.10 UI pending v0.16 exact-job/person booking created through UI and retained after restore.",
      "remaining_gaps_and_decisions": "Day/week/month and bounded range, team/job/archive filters, actual-UTC conflicts, multi-day/unavailable bookings and generated-origin links are implemented. Recurring edits go through review. Drag/drop, calendar print/share, external sync/notifications and interactive phone checks remain.",
      "next_stage": "Calendar UI rehearsal; later sync/print decisions"
    },
    {
      "id": "CAL02",
      "capability": "Recurring contracts, generated bookings, conflict review, holiday blocks and restore",
      "source_evidence": [
        "backend/routers/calendar.py:198-449",
        "backend/models.py:342-377",
        "frontend/src/components/admin/CalendarSection.jsx:605-785",
        "frontend/src/components/admin/DashboardDialogs.jsx:2101-2307"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "v0.20.1 unchanged backend: 60 targeted recurrence/calendar/recovery tests passed. v0.20.2 frontend: 167 client tests, 88 structural renders and build passed. Actual saved browser dataset fresh restore and second backup verified. Full 694-case v0.20 backend run remains historical.",
      "ui_verified_status": "Actual desktop Chrome v0.20.1: exact definition/people, 422 and leave retention, finite weekly generation, conflict/calendar correction, 409 stale retention, no duplicates, stable moved visit, cancellation without resurrection, overlapping blocks, future revision, pause/retire/restore/resume, protected past/completed history, monthly last-day/GMT/BST and spring gap skip, archived resource denial, history and empty second business. The packaged v0.20.2 removed-holiday label passed the explicitly approved final browser retest on 30 October; see recurrence-v0.20.2-browser-supplement. Its historical archive/report remains unchanged.",
      "remaining_gaps_and_decisions": "Five finite patterns and London policies implemented; weekly/monthly/spring-clock UI representative only, other date edges automated. Staff/portal, phone/accessibility/offline, specialist rates/batch billing, source-specific block types, visit-linked field stages, external calendars and production remain open. Legacy work not guessed onto occurrences. Raw saved-review JSON needs a more readable presentation. No automatic work/billing/messages.",
      "next_stage": "Visit-linked field and specialist recurrence parity; practical device and staff/customer checks remain separate. No scope exclusion or live approval."
    },
    {
      "id": "FIELD01",
      "capability": "Site Mode active jobs, logs, timer, photos, team size and invoice preview/generation",
      "source_evidence": [
        "frontend/src/components/admin/SiteModeTab.jsx",
        "backend/routers/site_mode.py",
        "frontend/src/hooks/useOfflineQueue.js"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial local core including v0.23 private text-note cancellation and saved-log correction",
      "automated_test_status": "v0.23: 205 client tests, 18 actual React component/DOM/store interactions, 90 structural render cases and 743 full backend tests passed. Simulated DOM is not browser proof. See device-note-lifecycle-checks.json.",
      "ui_verified_status": "v0.16 owner real 21.641-second capture, rejected zero-minute conversion with retained reason, explicit fictional half-hour correction, conversion, private note and invoice source review verified. v0.22: Real Chrome exact IndexedDB driver: eight storage checks, reload retention and actual competing tabs. Private owner/staff product UI is UNVERIFIED; no browser authentication/session injection. Prior-version journeys remain historical. v0.23 exact Chrome store migration, terminal cancellation, reload and actual two-tab claims passed. Signed-in product UI remains UNVERIFIED.",
      "remaining_gaps_and_decisions": "OPEN: material/photo upload queues, team-size/timer actions or reconstructed time, invoices/payments, portal replies, generic replay, cold offline unlock, push, authenticated owner/staff/device journeys, real-phone installation/background/standalone and production integration/key/retention policy. These remain parity work, not agreed exclusions.",
      "next_stage": "Authenticated owner/staff note/privacy/retry rehearsal and device validation; then extend remaining field/PWA purposes with explicit scope.",
      "device_note_axes": {
        "source": "Original useOfflineQueue and actual SiteMode consumers mapped in device-note-source-map.json; original ZIP unchanged.",
        "implementation": "v0.22 typed encrypted per-entry device text notes; exact actor/business/job/device binding; explicit retry; durable server receipts and correction revision fences. Existing v0.21 checked shell/update protections retained.",
        "tests": "205 client tests (22 device-note state/storage-failure cases and 2 typed API context checks), 90 structural renders, 148 selected backend access/field/identity/recovery tests; separate static PWA tests and extracted smoke in stage proof.",
        "ui": "Real Chrome exact IndexedDB driver: eight storage checks, reload retention and actual competing tabs. Private owner/staff product UI is UNVERIFIED; no browser authentication/session injection. Prior-version journeys remain historical.",
        "integration": "Local prototype and disposable synthetic storage fixture only. No live SHS, external service, deployment or native-device integration verified.",
        "missing": "OPEN: material/photo upload queues, team-size/timer actions or reconstructed time, invoices/payments, portal replies, generic replay, cold offline unlock, push, authenticated owner/staff/device journeys, real-phone installation/background/standalone and production integration/key/retention policy. These remain parity work, not agreed exclusions."
      },
      "lifecycle_v023": {
        "implementation": "Explicit never-sent device discard; durable cancellation of attempted sends; exact saved-log inspection, ordinary versioned correction/history, deliberate proposal discard; lost-reply and late-response safeguards; IndexedDB v2 opaque closed IDs.",
        "automated_tests": "device-note-lifecycle-checks.json; actual React DOM interactions in jsdom are simulated, not browser proof.",
        "browser": "Exact storage driver verified in Chrome: migration, cancellation, no resurrection, reload and two real tabs. Signed-in private app and real phones UNVERIFIED.",
        "remaining": "All existing full-parity gaps remain OPEN; authenticated owner walkthrough prepared separately, pending permission. Materials/photos/timers/team size/finance/portal replies, cold offline, push, production key and retention policy remain OPEN."
      }
    },
    {
      "id": "PHOTO01",
      "capability": "Private job photos, captions, categorisation, before/after and gallery promotion",
      "source_evidence": [
        "frontend/src/components/admin/DashboardDialogs.jsx",
        "frontend/src/components/admin/PortfolioTab.jsx",
        "backend/routers/files.py",
        "backend/routers/portfolio.py",
        "backend/routers/site_editor.py:193-437",
        "backend/routers/seo.py:69-113",
        "backend/storage.py:79-119"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented bounded local core; v0.20 public enquiry HEIF/size path added separately from unchanged authenticated uploads",
      "automated_test_status": "tests/test_photos.py; full prior regression suites; frontend/src/photo-rules.test.js; frontend/src/api.test.js; tests/test_public_enquiries.py; tests/test_enquiry_recovery.py v0.20: tests/test_enquiry_formats.py and test_enquiry_format_recovery.py; actual content and private projection verified separately from UI. v0.20.1: 41 selected photo/format recovery regressions, 167 client tests including 11 private-gallery access regressions, 88 structural render cases, build and saved-browser-data recovery passed.",
      "ui_verified_status": "v0.20.1 actual Chrome: owner private photo edit/validation/review, separate customer share/unshare, exact-job public draft, validation/permission, index/detail/service/lightbox, stale save retention, draft/public split, withdrawal, archive/restore, history-to-draft, re-review and republication. Private preview sign-out text/viewer leak repaired and retested; foreign-business preview denied. API-seeded source photos are not browser upload proof. Staff/customer portal browser branches remain unverified.",
      "remaining_gaps_and_decisions": "Exact-job private PNG/JPEG/WebP uploads, metadata stripping, captions/descriptions/category/stages/order/comparisons, assigned-staff submission, owner review/history, explicit customer sharing and reversible archive are implemented and API tested. No arbitrary URLs, destructive deletes, cross-job moves, source name-to-caption promotion or automatic publication. Wider field/offline/media formats remain. Actual new-format picker and selected-file controls, staff/customer browser journeys, related/multiple-project and website-library browser cases, GIF/TIFF/BMP and other format/device/offline/source parity gaps remain open, not agreed exclusions. Withdrawal returns a plain JSON 404; branded handling remains a usability improvement.",
      "next_stage": "Resolve documented upload/browser capability gap without repeated security-setting probes; then complete staff/customer and mobile/PWA/media parity with separate evidence. No new credentialed accounts as a browser workaround."
    },
    {
      "id": "PORTAL01",
      "capability": "Customer dashboard, jobs, documents, acceptance, setup and account access",
      "source_evidence": [
        "frontend/src/pages/CustomerPortal.jsx",
        "frontend/src/pages/PortalSetup.jsx",
        "backend/routers/portal.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_portal_access.py; tests/test_private_pdf.py; tests/test_portal_recovery.py; full prior regressions; frontend/src/portal-rules.test.js; frontend/src/api.test.js; server render and PDF artifact QA (no browser); frontend/src/portal-session.test.js (12 context/revalidation cases)",
      "ui_verified_status": "v0.12.1 setup/sign-in, exact-customer projection and isolation verified; v0.12.2 reissued setup, automatic revocation clearing and valid-check draft preservation verified. Recovery/contact-change/expiry and wider switching remain.",
      "remaining_gaps_and_decisions": "Exact Portal ID/password setup and recovery, protected .example captures, expiring hashed one-use codes, revocation, own jobs/progress/shared photos and shared/issued document history are implemented. No name/email joins or email verification claim. Permanent old codes are invalidated; legacy temporary codes work once. Deliberate quote responses and private downloads work locally. Production identity/delivery, usability, accessibility and mobile checks remain. v0.12.2 adds access-change/focus/visibility/periodic revalidation and private-content clearing; valid checks preserve response drafts. Cross-device/background timing remains unverified.",
      "next_stage": "Portal UI rehearsal; production identity later"
    },
    {
      "id": "AUTH01",
      "capability": "Owner/staff accounts, invitations, roles, password changes and recovery",
      "source_evidence": [
        "frontend/src/components/admin/SettingsTab.jsx",
        "frontend/src/pages/AdminLogin.jsx",
        "backend/routers/auth.py",
        "backend/auth.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local core",
      "automated_test_status": "tests/test_identity.py; tests/test_boundaries.py; tests/test_recovery.py; tests/test_documents.py; tests/test_websites.py; frontend/src/api.test.js",
      "ui_verified_status": "v0.7 UI pending",
      "remaining_gaps_and_decisions": "Exact owner/staff memberships, explicit scheduling-resource links, local single-use invitation/reset capture, existing-account password proof, last-owner protection and immediate subsequent-session revocation are implemented. Every endpoint has an explicit default-deny policy. Production identity/email verification, MFA, custom/support roles and broader staff tools remain.",
      "next_stage": "Identity/UI verification; production identity later"
    },
    {
      "id": "REPORT01",
      "capability": "Revenue/service/customer/team analytics, funnels, tags and metric definitions",
      "source_evidence": [
        "frontend/src/components/admin/AnalyticsTab.jsx",
        "backend/routers/analytics.py",
        "backend/routers/metrics.py",
        "backend/metrics_service.py",
        "backend/routers/opportunities.py",
        "backend/routers/enquiries.py",
        "frontend/src/lib/metricDefinitions.js"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local reporting core; broader scope partial",
      "automated_test_status": "611 full backend tests, including shared current eligibility and retained-identity/UK expiry cases; 94 client tests; 79 structural renders. See journey-milestone-checks.json.",
      "ui_verified_status": "v0.15 detailed reports/three CSVs retained. v0.16 Overview link, converted time once, direct-invoice cohort, receipt/balance and actual summary CSV verified.",
      "remaining_gaps_and_decisions": "Current open quote/job eligibility now shared by Overview, Operations and Reports; original GBP 160/120 fixture now agrees at GBP 120 with no record rewrites. All-date Overview receipts remain distinct from period receipts. Historical accounting, traffic, tax/payroll/forecasts, large-scale reporting and broader device/error UI remain.",
      "next_stage": "Broader reporting failure/device UI and specialist reporting policies"
    },
    {
      "id": "GROWTH01",
      "capability": "Repeat customers, quote follow-ups, review opportunities and nearby jobs",
      "source_evidence": [
        "frontend/src/components/admin/GrowthOpportunitiesPanel.jsx",
        "backend/routers/opportunities.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Implemented local review core; broader scope partial",
      "automated_test_status": "521 full backend cases; tests/test_workflow.py and tests/test_workflow_recovery.py; 85 client tests; 53 structural render cases. See workflow-milestone-checks.json.",
      "ui_verified_status": "v0.13 local draft, snooze, dismissal persistence, reopening, manual completion, five-event history, settings reload and separate-business queue verified. Quote/repeat/postcode eligibility rules are API tested; wider UI paths remain.",
      "remaining_gaps_and_decisions": "Exact-ID repeat-customer, current quote, feedback-history and next-action rules feed a private owner review queue. Optional saved postcode-group matching is explicit, with no inferred distance/geocoder. Business thresholds/exclusions, stable source generations, stale/concurrent/retry guards and decision history exist. No AI, scheduler, delivery or automatic finance/job mutation. Real transport, genuine location/distance planning and broader growth analytics remain.",
      "next_stage": "Broader opportunity UI and explicit transport/location decisions"
    },
    {
      "id": "GILBERTS01",
      "capability": "Gilberts rates, shifts, weekly summaries, schedule and batch invoicing",
      "source_evidence": [
        "frontend/src/components/admin/GilbertsTab.jsx",
        "backend/routers/gilberts.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Needs decision / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "Retain CNC/maintenance and contract-specific purpose. Prefer configurable contract rates/shifts/batch billing, or explicitly agree a private extension; no silent omission.",
      "next_stage": "Specialist contract stage"
    },
    {
      "id": "TAX01",
      "capability": "Tax reports, invoice/material classifications and historic rules",
      "source_evidence": [
        "backend/routers/tax.py",
        "backend/routers/analytics.py",
        "backend/routers/material_extraction.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Needs decision / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "Inventory remains in scope. Separate SHS cut-offs/exclusions from configurable reporting; obtain appropriate professional policy review before real tax use.",
      "next_stage": "Reporting policy stage"
    },
    {
      "id": "AI01",
      "capability": "Business chat, writing, quote estimates/follow-ups and insights",
      "source_evidence": [
        "frontend/src/components/admin/AIAssistantTab.jsx",
        "frontend/src/components/admin/AIWordingButton.jsx",
        "frontend/src/components/admin/AIInsightsPanel.jsx",
        "backend/routers/ai_chat.py",
        "backend/routers/ai_writer.py",
        "backend/server.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Integration-dependent / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "External calls stay disabled. Retain purposes and specify provider, cost, business scoping and review-before-write. No live provider decision made.",
      "next_stage": "AI decision/integration stage"
    },
    {
      "id": "GOOGLE01",
      "capability": "Google account linking, Drive storage, calendar/contact/email integration",
      "source_evidence": [
        "backend/google_utils.py",
        "backend/server.py",
        "backend/routers/settings.py",
        "backend/storage.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Integration-dependent / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "No live accounts or fallback credentials. Rebuild explicit per-business grants, scoped files and revocation; source R01/R04 remain open.",
      "next_stage": "Integration stage"
    },
    {
      "id": "CONNECT01",
      "capability": "ChatGPT connector, connection tokens, scoped data and revocation",
      "source_evidence": [
        "frontend/src/components/admin/ChatGPTConnectorCard.jsx",
        "backend/routers/connector.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Integration-dependent / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "Source connector is inventoried, not enabled. Separate approval/scoping and credential lifecycle are required.",
      "next_stage": "Connector decision stage"
    },
    {
      "id": "EMAIL01",
      "capability": "Email delivery guards, test capture, diagnostics and controlled transport",
      "source_evidence": [
        "backend/email_guard.py",
        "backend/server.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Integration-dependent / partial mock",
      "automated_test_status": "tests/test_identity.py; tests/test_boundaries.py; tests/test_recovery.py; tests/test_documents.py; tests/test_websites.py; frontend/src/api.test.js",
      "ui_verified_status": "v0.7 capture API/CLI tested; UI pending",
      "remaining_gaps_and_decisions": "No real delivery. Invitations are one-time owner response captures; password recovery uses private local mock files excluded from packages/backups. Hashed, scoped, expiring single-use tokens and generic reset responses are tested. Verified addresses, actual transport, diagnostics and production recovery remain.",
      "next_stage": "Messaging integration stage"
    },
    {
      "id": "SETTINGS01",
      "capability": "Business identity, pricing, document wording, team and integration settings",
      "source_evidence": [
        "frontend/src/components/admin/SettingsTab.jsx",
        "backend/routers/settings.py",
        "backend/models.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_portal_access.py; tests/test_private_pdf.py; tests/test_portal_recovery.py; full prior regressions; frontend/src/portal-rules.test.js; frontend/src/api.test.js; server render and PDF artifact QA (no browser)",
      "ui_verified_status": "v0.11 snapshot/config tests pass; UI pending",
      "remaining_gaps_and_decisions": "Private payment instructions, acknowledgement wording, reference prefixes/year/digits apply to new documents. Existing historical branding/terms remain sealed. Published identity/defaults and owner/staff memberships remain. General pricing, specialist rates, custom roles and integrations remain.",
      "next_stage": "Settings UI rehearsal; remaining configuration"
    },
    {
      "id": "STORAGE01",
      "capability": "Owned files, storage diagnostics, orphan review and safe cleanup",
      "source_evidence": [
        "frontend/src/components/admin/StorageCleanupCard.jsx",
        "backend/routers/maintenance.py",
        "backend/routers/files.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial",
      "automated_test_status": "See docs/VERIFICATION.md for the limited implemented portion",
      "ui_verified_status": "Website images earlier checked",
      "remaining_gaps_and_decisions": "Owned website PNGs only. Storage usage/orphan reports and reviewed cleanup are missing; preserve dependencies and IDs before deleting.",
      "next_stage": "Storage operations stage"
    },
    {
      "id": "PWA01",
      "capability": "Installable PWA, service worker updates, offline field queue and push",
      "source_evidence": [
        "frontend/public/service-worker.js",
        "frontend/src/index.js",
        "frontend/src/hooks/useOfflineQueue.js",
        "backend/routers/push_notifications.py"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Partial local core including v0.23 private text-note cancellation and saved-log correction",
      "automated_test_status": "v0.23: 205 client tests, 18 actual React component/DOM/store interactions, 90 structural render cases and 743 full backend tests passed. Simulated DOM is not browser proof. See device-note-lifecycle-checks.json.",
      "ui_verified_status": "Actual public desktop Chrome: first/failed install, two-tab dirty and pending/uncertain-save deferral, reconnect without replay, deliberate retry once, requesting-tab-only reload, old/new bundle coexistence, namespace cleanup and actual server-loss fallback. Final cached bytes match release; no authenticated or phone claim. v0.22: Real Chrome exact IndexedDB driver: eight storage checks, reload retention and actual competing tabs. Private owner/staff product UI is UNVERIFIED; no browser authentication/session injection. Prior-version journeys remain historical. v0.23 exact Chrome store migration, terminal cancellation, reload and actual two-tab claims passed. Signed-in product UI remains UNVERIFIED.",
      "remaining_gaps_and_decisions": "OPEN: material/photo upload queues, team-size/timer actions or reconstructed time, invoices/payments, portal replies, generic replay, cold offline unlock, push, authenticated owner/staff/device journeys, real-phone installation/background/standalone and production integration/key/retention policy. These remain parity work, not agreed exclusions.",
      "next_stage": "Authenticated owner/staff note/privacy/retry rehearsal and device validation; then extend remaining field/PWA purposes with explicit scope.",
      "pwa_axes": {
        "source": "Original useOfflineQueue and actual SiteMode consumers mapped in device-note-source-map.json; original ZIP unchanged.",
        "implementation": "v0.22 typed encrypted per-entry device text notes; exact actor/business/job/device binding; explicit retry; durable server receipts and correction revision fences. Existing v0.21 checked shell/update protections retained.",
        "automated": "205 client tests (22 device-note state/storage-failure cases and 2 typed API context checks), 90 structural renders, 148 selected backend access/field/identity/recovery tests; separate static PWA tests and extracted smoke in stage proof.",
        "ui": "Real Chrome exact IndexedDB driver: eight storage checks, reload retention and actual competing tabs. Private owner/staff product UI is UNVERIFIED; no browser authentication/session injection. Prior-version journeys remain historical.",
        "integration": "Local prototype and disposable synthetic storage fixture only. No live SHS, external service, deployment or native-device integration verified.",
        "missing": "OPEN: material/photo upload queues, team-size/timer actions or reconstructed time, invoices/payments, portal replies, generic replay, cold offline unlock, push, authenticated owner/staff/device journeys, real-phone installation/background/standalone and production integration/key/retention policy. These remain parity work, not agreed exclusions.",
        "decision": "Production key lifecycle and browser retention policy remain open; no cold offline unlock or remote wipe claim.",
        "tests": "205 client tests (22 device-note state/storage-failure cases and 2 typed API context checks), 90 structural renders, 148 selected backend access/field/identity/recovery tests; separate static PWA tests and extracted smoke in stage proof."
      },
      "device_note_axes": {
        "source": "Original useOfflineQueue and actual SiteMode consumers mapped in device-note-source-map.json; original ZIP unchanged.",
        "implementation": "v0.22 typed encrypted per-entry device text notes; exact actor/business/job/device binding; explicit retry; durable server receipts and correction revision fences. Existing v0.21 checked shell/update protections retained.",
        "tests": "205 client tests (22 device-note state/storage-failure cases and 2 typed API context checks), 90 structural renders, 148 selected backend access/field/identity/recovery tests; separate static PWA tests and extracted smoke in stage proof.",
        "ui": "Real Chrome exact IndexedDB driver: eight storage checks, reload retention and actual competing tabs. Private owner/staff product UI is UNVERIFIED; no browser authentication/session injection. Prior-version journeys remain historical.",
        "integration": "Local prototype and disposable synthetic storage fixture only. No live SHS, external service, deployment or native-device integration verified.",
        "missing": "OPEN: material/photo upload queues, team-size/timer actions or reconstructed time, invoices/payments, portal replies, generic replay, cold offline unlock, push, authenticated owner/staff/device journeys, real-phone installation/background/standalone and production integration/key/retention policy. These remain parity work, not agreed exclusions."
      },
      "lifecycle_v023": {
        "implementation": "Explicit never-sent device discard; durable cancellation of attempted sends; exact saved-log inspection, ordinary versioned correction/history, deliberate proposal discard; lost-reply and late-response safeguards; IndexedDB v2 opaque closed IDs.",
        "automated_tests": "device-note-lifecycle-checks.json; actual React DOM interactions in jsdom are simulated, not browser proof.",
        "browser": "Exact storage driver verified in Chrome: migration, cancellation, no resurrection, reload and two real tabs. Signed-in private app and real phones UNVERIFIED.",
        "remaining": "All existing full-parity gaps remain OPEN; authenticated owner walkthrough prepared separately, pending permission. Materials/photos/timers/team size/finance/portal replies, cold offline, push, production key and retention policy remain OPEN."
      }
    },
    {
      "id": "WHITE01",
      "capability": "Empty business provisioning, isolated data, branding and one maintained product",
      "source_evidence": [
        "backend/database.py",
        "backend/models.py",
        "new venture requirement"
      ],
      "source_status": "user-required; source parity not assumed",
      "implementation_status": "Partial",
      "automated_test_status": "tests/test_identity.py; tests/test_boundaries.py; tests/test_recovery.py; tests/test_documents.py; tests/test_websites.py; frontend/src/api.test.js",
      "ui_verified_status": "v0.7 UI pending; multi-business APIs tested",
      "remaining_gaps_and_decisions": "Signed-in owners can provision additional empty invented businesses and switch existing memberships. Safe slugs, concurrent/retried creation and partial-filesystem recovery are tested. Up to 25 local businesses are bounded; four-business recovery is verified. Real subscribers, module entitlements and production architecture remain.",
      "next_stage": "Provisioning/UI verification; subscriber architecture later"
    },
    {
      "id": "WHITE02",
      "capability": "Subscriber-owned domains, ownership verification, routing, HTTPS and email preservation",
      "source_evidence": [
        "new venture requirement",
        "local reserved-domain simulator"
      ],
      "source_status": "user-required; source parity not assumed",
      "implementation_status": "Integration-dependent / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Simulator only",
      "remaining_gaps_and_decisions": "Only .test mapping is implemented. Real DNS, hosting, certificates, domain ownership and disconnect flows are not authorised or tested.",
      "next_stage": "Domain stage"
    },
    {
      "id": "WHITE03",
      "capability": "Trial/subscription lifecycle, entitlement, cancellation and support operations",
      "source_evidence": [
        "new venture requirement",
        "no working subscription flow established in export"
      ],
      "source_status": "user-required; source parity not assumed",
      "implementation_status": "Needs decision / missing",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Not verified",
      "remaining_gaps_and_decisions": "Pricing/trial policy, paid accounts, billing provider, limits and support commitments remain undecided. Invoice receipts are not subscription billing.",
      "next_stage": "Commercial operations stage"
    },
    {
      "id": "TRAIN01",
      "capability": "Assisted setup, checklists, concise help and task videos",
      "source_evidence": [
        "new venture requirement",
        "local Setup & help and guides"
      ],
      "source_status": "user-required; source parity not assumed",
      "implementation_status": "Partial",
      "automated_test_status": "662 backend, 125 client and 84 structural render checks; browser and recovery evidence recorded separately.",
      "ui_verified_status": "v0.19 practical enquiry date/photo guide records actual input/error/save/reopen evidence, recovery, size/format differences, runtime cloud-file interruption and remaining leave-dialog/UI gaps; prior guides retained. v0.20.1 gallery walkthrough/evidence now records the completed bounded owner journey, preview repair and recovery; older selected-file and Incognito cleanup gaps remain.",
      "remaining_gaps_and_decisions": "Dialog dismissal and test-tab cleanup pending; broader assisted setup, accessibility/phone checks and captioned task videos remain.",
      "next_stage": "Gallery/photo walkthrough; wider assisted setup and captioned task videos later"
    },
    {
      "id": "RECOVERY01",
      "capability": "Backup, verification, fresh restore, migration, export and operational recovery",
      "source_evidence": [
        "new reliability requirement",
        "independent prototype: backend/recovery.py"
      ],
      "source_status": "user-required; source parity not assumed",
      "implementation_status": "Partial",
      "automated_test_status": "662 backend cases cover current format 12, exact pinned formats 1\u201311 and four-business drills. The actual v0.19 browser dataset passed stopped backup, 80-table comparisons per business, exact original facts/photo bytes, old-access denial, replay without duplicates and second-generation verification. v0.20 preserves format 12/pinned 1-11, adds metadata version 0.20.0 and accepts old 0.19.0 format-12 archives; new-format recovery drill and current full regression evidence are versioned separately.",
      "ui_verified_status": "v0.19 stopped UI-created enquiries/photos restored and replayed without duplicates through terminal/test APIs. Four-business disappearance preserved original facts, photo bytes and older finance/field/document/feedback histories; permissions suspended. No restored-browser or second-machine claim. v0.20.1 exact gallery-browser dataset restored into a fresh folder; all media bytes/original facts/history retained, sharing/review suspended, gallery withdrawn, old sessions denied and second generation verified. Same-Mac terminal/API proof only.",
      "remaining_gaps_and_decisions": "Format 12 adds immutable intake facts and photo provenance; restored visitor-photo review/sharing is suspended and affected public projects withdrawn. Older finance/field/document/feedback evidence remains. Encrypted/off-device/production recovery, restored-browser and another-machine rehearsal remain.",
      "next_stage": "Second-machine trial and reliability gates"
    },
    {
      "id": "SOURCE01",
      "capability": "Complete source/assets/deployment knowledge and rights/provenance",
      "source_evidence": [
        "275-file filtered supplied ZIP",
        "source-manifest.json",
        "PROVENANCE.md"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Needs evidence",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Source-only; live unverified",
      "remaining_gaps_and_decisions": "Filtered source is not a complete original export. Missing static media/root configuration/runtime settings and rights evidence remain; source tests are never run. v0.20 native wheel/licence implications and exact hashes are recorded in enquiry-format-dependencies.json; commercial native distribution remains a decision.",
      "next_stage": "Source completeness gate"
    },
    {
      "id": "SECURITY01",
      "capability": "All 14 original findings and independent trial/release security checks",
      "source_evidence": [
        "Original review R01\u2013R14",
        "review-findings.json"
      ],
      "source_status": "source-evidenced",
      "implementation_status": "Open against original",
      "automated_test_status": "No capability-specific implementation test yet",
      "ui_verified_status": "Only stated local regression tests",
      "remaining_gaps_and_decisions": "New equivalents have some tested controls; none fixes the deployed SHS system. Production auth, roles, storage, integrations, dependencies and independent review remain gates.",
      "next_stage": "Every stage; trial/release gates"
    }
  ],
  "original_security_findings": [
    {
      "id": "R01",
      "priority": "P1",
      "original_finding": "The Drive proxy can serve private files without authentication",
      "source_locations": "backend/server.py:880-912; backend/google_utils.py:14-43; backend/database.py:28-34",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "No Drive proxy; only explicitly published owned PNGs are public. Production storage/integrations still missing."
    },
    {
      "id": "R02",
      "priority": "P1",
      "original_finding": "Generated invoices and quotes have predictable public file URLs",
      "source_locations": "backend/routers/portfolio.py:62-67; backend/server.py:1463-1472, 2786-2787, 1682-1708, 3167-3204",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Private PDFs authorise exact business/customer/state per download, retaining saved content and separate current summaries. Artifact QA passes; browser download/print is unverified."
    },
    {
      "id": "R03",
      "priority": "P1",
      "original_finding": "Public uploads can become active content on the SHS origin",
      "source_locations": "backend/routers/files.py:53-98; backend/storage.py:81-135; backend/routers/portfolio.py:19-60",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Image decoding/re-encoding and bounds in the local website upload path; future job/files endpoints need the same controls."
    },
    {
      "id": "R04",
      "priority": "P1",
      "original_finding": "Google account linking trusts an unverified administrator ID",
      "source_locations": "backend/server.py:478-554",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Google linking absent/disabled; safe per-business OAuth still required."
    },
    {
      "id": "R05",
      "priority": "P1",
      "original_finding": "Portal document access is based on name or email patterns",
      "source_locations": "backend/routers/portal.py:239-305",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Exact immutable customer/job/business links, scoped portal reads and cross-customer tests; no name/email authorisation."
    },
    {
      "id": "R06",
      "priority": "P1",
      "original_finding": "Public review feeds return private feedback fields",
      "source_locations": "backend/routers/feedback.py:22-45; backend/models.py:192-221",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "v0.12 uses fixed name/statement/optional-rating public projection, separate customer permission, deliberate owner publication and withdrawal/recovery guards; private answers never serialized publicly. API/HTML sentinel tests pass. New UI/delivery/policy remain unverified. Original R06 remains OPEN."
    },
    {
      "id": "R07",
      "priority": "P1",
      "original_finding": "Payment updates can lose entries or count retries twice",
      "source_locations": "backend/server.py:2016-2075; related editing/deletion paths:2105-2211",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "One transactional payment ledger, idempotency, stale-version checks, derived stage balances, concurrency and reversal tests in v0.5."
    },
    {
      "id": "R08",
      "priority": "P1",
      "original_finding": "The dependency manifest pins a vulnerable Starlette version",
      "source_locations": "backend/requirements.txt:25,126; public UploadFile handlers in backend/routers/files.py and portfolio.py",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Pinned ReportLab 4.4.9, pypdf 6.10.0 and charset-normalizer 3.5.2 added; bundled DejaVu licences/hashes included. Comprehensive advisory/production dependency review remains."
    },
    {
      "id": "R09",
      "priority": "P2",
      "original_finding": "Access revocation does not cover existing sessions",
      "source_locations": "backend/routers/portal.py:135-154,370-381; backend/routers/auth.py:234-240; backend/auth.py:86-91",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Local membership disable/role/resource changes revoke business sessions; password/reset changes revoke all account sessions. Last-owner and cross-business controls are tested. Production identity remains open."
    },
    {
      "id": "R10",
      "priority": "P2",
      "original_finding": "Forgot-password creates a token but never delivers it",
      "source_locations": "backend/routers/auth.py:35-45,130-150; backend/tests/test_phase5_security.py:55-62",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "No real recovery email. Local scoped expiring single-use hashed invite/reset tokens, generic responses, private capture and restore invalidation are tested. Production delivery, verification and recovery policy remain open."
    },
    {
      "id": "R11",
      "priority": "P2",
      "original_finding": "The offline queue can lose work or replay it twice",
      "source_locations": "frontend/src/hooks/useOfflineQueue.js:35-82; backend/routers/site_mode.py:207-227; frontend/src/pages/AdminDashboard.jsx:1600-1607",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "No offline queue implemented. Future queue must scope accounts/jobs, remove acknowledged IDs only and preserve new entries."
    },
    {
      "id": "R12",
      "priority": "P2",
      "original_finding": "Security controls are optional and do not cover every client path",
      "source_locations": "backend/security_phase5.py:30-44; backend/routers/auth.py:65-76; backend/server.py:6033-6059; frontend/src/App.js:51-63; frontend/src/components/admin/SiteModeTab.jsx:26-29,374-392",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Same-origin/CSRF policy covers local writes and one client is used. Production policy and every future integration still require checks."
    },
    {
      "id": "R13",
      "priority": "P2",
      "original_finding": "The supplied tests are not safely isolated by default",
      "source_locations": "backend/tests/conftest.py:8-28,39-60,82-100; backend/tests/test_phase5_security.py:27-51",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "Tests use generated fictional data/disposable folders only; original tests/startup/credentials are not run."
    },
    {
      "id": "R14",
      "priority": "P2",
      "original_finding": "Automatic PWA updates can discard unsaved editing",
      "source_locations": "frontend/src/index.js:19-39; frontend/src/pages/AdminDashboard.jsx:448-485; frontend/src/pages/AdminLogin.jsx:54-77",
      "original_status": "OPEN \u2014 original SHS code and production unchanged",
      "new_local_equivalent": "No forced service-worker reload in this app. Dirty-form guards and saved/reload states exist; installed PWA/update tests remain missing."
    }
  ],
  "source_files": [
    {
      "path": "backend/auth.py",
      "bytes": 3734,
      "sha256": "75db72467d7c59d7f596afd93ce537872ef4bbf47804a11806da8c390c264c82"
    },
    {
      "path": "backend/constants.py",
      "bytes": 10277,
      "sha256": "4afdfd390b1aca9016de27aaca29d7607b78688b9a2f5cd40c448611523db55a"
    },
    {
      "path": "backend/customer_dedup.py",
      "bytes": 10012,
      "sha256": "a7d4e9c7ab55ed557a8f0c78264be3ee6a64bf6ef9f5643090a9150f352394a7"
    },
    {
      "path": "backend/database.py",
      "bytes": 1448,
      "sha256": "a3f73a3db12b7731acac0e27d836d91f45f2420b308cf51d6f6bea44e517845c"
    },
    {
      "path": "backend/email_guard.py",
      "bytes": 9147,
      "sha256": "7e7a7ac3c2993bf1b056321b6bdb4b47b7f6d27d68ee07f050e42987be27bb14"
    },
    {
      "path": "backend/google_utils.py",
      "bytes": 5488,
      "sha256": "0c87bd23d6771faf71b2a810d4b1e0bd8796a322699932eefc04217ec00cb256"
    },
    {
      "path": "backend/metrics_service.py",
      "bytes": 14183,
      "sha256": "24a39b176f1140b287aedf56181ce0028c6ba0b7e07ab4f7068bcc81b9f987ec"
    },
    {
      "path": "backend/migrations/migrate_statuses.py",
      "bytes": 6880,
      "sha256": "163b0683111767bd35d6eec9a17bc9892ffb8100f4271ff4829c3040b063ab2a"
    },
    {
      "path": "backend/models.py",
      "bytes": 23318,
      "sha256": "961ce026b4b7a17ffef8e8d5b35fdc69f4862e9cb81535b1069bb29b2687bbd2"
    },
    {
      "path": "backend/requirements.txt",
      "bytes": 2603,
      "sha256": "97a4458035810fabaa0da85912fa199cba04eb93f9a472c9202901f42f79af38"
    },
    {
      "path": "backend/routers/__init__.py",
      "bytes": 2550,
      "sha256": "be55b907baff4ea7624b229db56c52c4d9c9cbd331c66727a5f0a6389ce08b40"
    },
    {
      "path": "backend/routers/ai_chat.py",
      "bytes": 8674,
      "sha256": "83cc38dcbb696107b817da2aa50abb9baa83f18e1418c6b7be3ae09d49656895"
    },
    {
      "path": "backend/routers/ai_writer.py",
      "bytes": 7465,
      "sha256": "6519a064f3dee83e7e4852423f2832e33d59496799bbc439b65c897e7a32dcc0"
    },
    {
      "path": "backend/routers/analytics.py",
      "bytes": 29772,
      "sha256": "e577f03910af525bfaf613ee35e60e04d1abb9d93d01093a91b4dd7165da1ce9"
    },
    {
      "path": "backend/routers/auth.py",
      "bytes": 14801,
      "sha256": "de895cd1f037e640eac4059f0542d740a4d9b52b4c0e80a2738ff7322c84d982"
    },
    {
      "path": "backend/routers/calendar.py",
      "bytes": 19457,
      "sha256": "91a1f666c8f7c58c8346b61389b2223d23a36699eaf2000dd24350abb4aa9375"
    },
    {
      "path": "backend/routers/connector.py",
      "bytes": 5667,
      "sha256": "8909a2ac93cc1616c593577670b47c9be13db4802bdd66031df9a535765c7947"
    },
    {
      "path": "backend/routers/customer_duplicates.py",
      "bytes": 22375,
      "sha256": "440bed2ca86b6870ae9320baffae3bbceae86d0a12308fbca47f92768095a11b"
    },
    {
      "path": "backend/routers/customers.py",
      "bytes": 20484,
      "sha256": "75186ee6a6dce63961561183f36d19489cfd3290b7691e822107f4b87eadaec7"
    },
    {
      "path": "backend/routers/enquiries.py",
      "bytes": 43342,
      "sha256": "dbd0e4b3c74eb5ed344d7d754962dfc7d45134f49318043b34a82d3d46b8878c"
    },
    {
      "path": "backend/routers/feedback.py",
      "bytes": 9257,
      "sha256": "746236f2b1b70fb2af3725ef0e263f09ed24b3b670c5be231bb77e1f28c51318"
    },
    {
      "path": "backend/routers/files.py",
      "bytes": 3544,
      "sha256": "2b2e2f04a95fdd36d1e23358bb2bc7a47b09e5f68752bae0ee9029b39c86f9bc"
    },
    {
      "path": "backend/routers/gilberts.py",
      "bytes": 10617,
      "sha256": "a03d133b0a7ce812f4d40065d22ab3d3295cd5c8deec13f17830620132ac4e51"
    },
    {
      "path": "backend/routers/invoice_ocr.py",
      "bytes": 18550,
      "sha256": "ba9239e9778f516e7d64a62ce3889ec60334414aa3bb0154b0634f72592c87e3"
    },
    {
      "path": "backend/routers/maintenance.py",
      "bytes": 3045,
      "sha256": "7ce4049b1ea93c722ad839b7d038fd87b6251ad9a76bf59d9c1353cbd80e79a8"
    },
    {
      "path": "backend/routers/material_extraction.py",
      "bytes": 16312,
      "sha256": "fc8657e2206baad65c4096ebe2c54cc0d8d3a8732f0374b5c603fc60bc57bd58"
    },
    {
      "path": "backend/routers/materials.py",
      "bytes": 17089,
      "sha256": "d21862805a08aa79f70ea7bf8c77aae39b6c4245a802b9bd0bb8bea4b65c8354"
    },
    {
      "path": "backend/routers/materials_catalogue.py",
      "bytes": 20130,
      "sha256": "46b3efc0139dfbc81db191e00a84cb4a18dd405f8e7eed286fb1bf49585411f6"
    },
    {
      "path": "backend/routers/metrics.py",
      "bytes": 435,
      "sha256": "8a2a8607ace3d5bafcf45b07caff7e78f57700056ecf54943afae265600d91f0"
    },
    {
      "path": "backend/routers/opportunities.py",
      "bytes": 22500,
      "sha256": "88e44dd48c8c994bbfeaa825b4402d675f2ba51a2c9b687f9491bd8735d416f1"
    },
    {
      "path": "backend/routers/payment_schedule.py",
      "bytes": 20859,
      "sha256": "b382edafce116df840cb3179cdf9324b172ba675cb4651d6d69272bd87431f6e"
    },
    {
      "path": "backend/routers/portal.py",
      "bytes": 15196,
      "sha256": "d4e6b3ba9305028614aec84f80a13ec135189590e482e5a37036e2e080053d8e"
    },
    {
      "path": "backend/routers/portfolio.py",
      "bytes": 11247,
      "sha256": "84cacfdb582b061fdae052e1722cbc0e674f2cbfb23cb68f1f04bd13b3a90d12"
    },
    {
      "path": "backend/routers/project.py",
      "bytes": 14821,
      "sha256": "32bd3b4a6511bab189e4b92ff600911e5dc2171faa19a04b1adfd78b86f918ce"
    },
    {
      "path": "backend/routers/push_notifications.py",
      "bytes": 5060,
      "sha256": "cfb557d790ad6d16843dc77741c5f4bad3989d4ea37fc85d06e652987624fe92"
    },
    {
      "path": "backend/routers/seo.py",
      "bytes": 6675,
      "sha256": "85806951833d3d0f13039d4706717ca36083bcc5b1abffa739fd2b1415e44e74"
    },
    {
      "path": "backend/routers/settings.py",
      "bytes": 4653,
      "sha256": "fa1d1c8cbef2d54765838d70c2da16566cf933a683c840494581c82431e96d7d"
    },
    {
      "path": "backend/routers/site_editor.py",
      "bytes": 22972,
      "sha256": "d1eb432b9b43f7e057d773d67df413f57febbd819d4b020ebda73b41a5831888"
    },
    {
      "path": "backend/routers/site_mode.py",
      "bytes": 21326,
      "sha256": "6523bd9a47451ee307169f5f999b4b1c5e2de257f527266e9f2860aec85a3ac2"
    },
    {
      "path": "backend/routers/tax.py",
      "bytes": 18660,
      "sha256": "06a0d792c315fddcd9ad21607d8d32f42d4cb2472687ffce903e85f62d77ab2a"
    },
    {
      "path": "backend/routers/time_entries.py",
      "bytes": 6895,
      "sha256": "b6d2157426e284a315ec13561df5638f91d286f325360350f32ac7931a6afbf2"
    },
    {
      "path": "backend/security_phase5.py",
      "bytes": 11208,
      "sha256": "46843eed7e39ef2cc0b402f8e106bfbe86afea934a3945cc20820d14e6bab497"
    },
    {
      "path": "backend/server.py",
      "bytes": 274573,
      "sha256": "c3e83a2593fbccb41bf5cebcd7a1b3a6fe688e54afcd8db409213caf64e950d7"
    },
    {
      "path": "backend/storage.py",
      "bytes": 5024,
      "sha256": "4bee13701c2883ce561f57f98e533af8aa8cda6810e6aa71a49b2dbcb1e471d6"
    },
    {
      "path": "backend/tests/conftest.py",
      "bytes": 5749,
      "sha256": "5f957950f07b6274b108f9d92e59dfa59422a5da7b613d1ef4b048d1e362299a"
    },
    {
      "path": "backend/tests/test_analytics_fixes.py",
      "bytes": 10957,
      "sha256": "f2d2c6265e9597375747256db6e8d33136759490f03feb5c05c4145282ec14e4"
    },
    {
      "path": "backend/tests/test_code_refactor_iteration33.py",
      "bytes": 11919,
      "sha256": "c6482196f85bf735eaf522d7c218399785553153c0694424ab0e2c1069cf86cb"
    },
    {
      "path": "backend/tests/test_cors_allowlist.py",
      "bytes": 6970,
      "sha256": "3dc5076d651d2da18311e635ea43d490ed97cd0c132d60718a08e2239c4f5735"
    },
    {
      "path": "backend/tests/test_customer_linking.py",
      "bytes": 12028,
      "sha256": "ab271eca986c129799f531f4c70a08e2e6f801120c7502cd2fb444488b909463"
    },
    {
      "path": "backend/tests/test_delete_payment.py",
      "bytes": 6551,
      "sha256": "a08b09f56a5104bdb1e4e090f9360a4fa77171df681540340ecc7d13e5b1e382"
    },
    {
      "path": "backend/tests/test_deposit_invoices.py",
      "bytes": 18397,
      "sha256": "e4ba32986f4d31970c4ae87787971b17ab2782b1ea724441bf4b6ecb745a3743"
    },
    {
      "path": "backend/tests/test_deposit_payments_iteration34.py",
      "bytes": 16802,
      "sha256": "e75bd65ef1a1f1c2af4c44686363ce0a3cd0382f12b475a58b0170a42b1816b3"
    },
    {
      "path": "backend/tests/test_drive_integration.py",
      "bytes": 10749,
      "sha256": "8261ec3efd87ae680d9d3834b58c9542b4a6efc163139418762816ca98729063"
    },
    {
      "path": "backend/tests/test_email_guard.py",
      "bytes": 12826,
      "sha256": "96b4b5bc151834f49126e3d79e6bad9ad4ee744bf7be376a34a12e50b5582cfc"
    },
    {
      "path": "backend/tests/test_enhanced_analytics.py",
      "bytes": 10213,
      "sha256": "014bd5a8d568d72ad3a525f0aa922b79db46c7f50f7914ee4a3e43f0fdaac291"
    },
    {
      "path": "backend/tests/test_feedback_edit.py",
      "bytes": 12787,
      "sha256": "cde045e116b1f2778cd0b2fc229ca567728750a3fe2cbebdfcf3254915d67f56"
    },
    {
      "path": "backend/tests/test_google_calendar_notifications.py",
      "bytes": 14339,
      "sha256": "6c6620a972c30a2b191d9b2c8c0d8a5e6553b457dbc871beb3929ed41589e238"
    },
    {
      "path": "backend/tests/test_iteration10.py",
      "bytes": 18855,
      "sha256": "311c25080b2812679ee4cf2138eab8e87f5001958448b8de47f315aad545ea46"
    },
    {
      "path": "backend/tests/test_iteration11.py",
      "bytes": 22580,
      "sha256": "22543271d3c97ac13b12a70200316501f75382a58d41d91cb28a42f3d7226501"
    },
    {
      "path": "backend/tests/test_iteration35_fixes.py",
      "bytes": 15324,
      "sha256": "34911b68484a32a1be76063938437709a1e73627b287ddc32c2263b12676b59a"
    },
    {
      "path": "backend/tests/test_iteration36_fixes.py",
      "bytes": 12166,
      "sha256": "867a47181065bd9ca0b414a9e5283c6efe14a055776bdeff334b40fc1bec5ca6"
    },
    {
      "path": "backend/tests/test_iteration37_materials.py",
      "bytes": 8424,
      "sha256": "0626f602ed272e5ce40fc39122bc93d552e9d6552e8dc2a59f164715e4a64af8"
    },
    {
      "path": "backend/tests/test_iteration39_tax.py",
      "bytes": 10282,
      "sha256": "1d68acef60fc173c13693b07c7f9318f3ed49f458197d07a917b9abee4b46e20"
    },
    {
      "path": "backend/tests/test_iteration40_version_refresh.py",
      "bytes": 4424,
      "sha256": "d934c1b57093003ac26376ecde2907927090f005d74b00fa2e96e0eefdc3f0c4"
    },
    {
      "path": "backend/tests/test_iteration41_project_command.py",
      "bytes": 8815,
      "sha256": "303e89ff3dda453b00bbd85e8e41ea60ec6bf804933d1557b2c1ec01083d21b4"
    },
    {
      "path": "backend/tests/test_iteration42_suggested_lines.py",
      "bytes": 9823,
      "sha256": "b5108f5c742eb179f4946375f9b3b03324a75ca11c9a4dffdaa8bcf77a166c2e"
    },
    {
      "path": "backend/tests/test_iteration43_accountant.py",
      "bytes": 5951,
      "sha256": "7915c6571118edfd1064d611c681e10e8b7df80a26291a23e40d642bea0fc9e3"
    },
    {
      "path": "backend/tests/test_iteration44_uifix_regression.py",
      "bytes": 5639,
      "sha256": "af5763d421f6915619f51d42eb31c42ce46ece57404b4a59fa81e6870732c947"
    },
    {
      "path": "backend/tests/test_iteration45_regression.py",
      "bytes": 4529,
      "sha256": "c634bdd6abeb6ffceb6321c36c05cca3b3664ad3877d40416587ab37142c138d"
    },
    {
      "path": "backend/tests/test_iteration46_regression.py",
      "bytes": 4721,
      "sha256": "e22b6bc6cd85f6f39944ba00f92f50de19b3858b75fb961e2f56f04fe6c5b93b"
    },
    {
      "path": "backend/tests/test_iteration48_site_editor.py",
      "bytes": 9162,
      "sha256": "ca2bc1b730b226d2eccd49cbed4d438abedd1203ea3066bcea363b7b92292788"
    },
    {
      "path": "backend/tests/test_iteration49_services_slug_bulkmove.py",
      "bytes": 14157,
      "sha256": "1866b2bcce10fbdd076d5f04944ad74251c3e0c772001a0416cdead3633ba8dd"
    },
    {
      "path": "backend/tests/test_iteration50_gallery_slug.py",
      "bytes": 11293,
      "sha256": "bea3e5d8a7d58cc4c84b8e27051b6c37870e37e98cf1936d2f2e0f7fdf36d97e"
    },
    {
      "path": "backend/tests/test_iteration51_phase2_procurement.py",
      "bytes": 11815,
      "sha256": "034364a05d8c654819e138e2a9113c1453c6660e358b4b8e157143fb0437a080"
    },
    {
      "path": "backend/tests/test_iteration52_ocr_dates.py",
      "bytes": 12438,
      "sha256": "c0316d82edb90e4ac06372b883fe521a0b56b89dcb09da72bcc46f7571091ec6"
    },
    {
      "path": "backend/tests/test_iteration54_paid_on_approve.py",
      "bytes": 6793,
      "sha256": "5cece463b5375fba73cb80d8a7ba760f67e7165b5335dbe9503a175d7b01b2d5"
    },
    {
      "path": "backend/tests/test_iteration55_invoice_referencing.py",
      "bytes": 9831,
      "sha256": "654be0ff5cd3fc59394a7d065a6451b61905198f9263590dd8cff90b4228f6a9"
    },
    {
      "path": "backend/tests/test_iteration56_strict_sort_no_renumber.py",
      "bytes": 2363,
      "sha256": "7fdd2d1b9d95df3917213b8e677f4f1753da31213c71b68dc19ca04992e1e028"
    },
    {
      "path": "backend/tests/test_iteration57_reference_sort.py",
      "bytes": 4079,
      "sha256": "dc15b4c56d8884cef19458c97d2f9718dd62614e3eef170a171fd7a55fa31942"
    },
    {
      "path": "backend/tests/test_iteration58_materials_supplier.py",
      "bytes": 7740,
      "sha256": "09ba498735f272c9572595f1578ddc812a0be095246b779ae17e42dff7e6cb23"
    },
    {
      "path": "backend/tests/test_iteration59_unified_customer_jobs.py",
      "bytes": 8357,
      "sha256": "9838049b46f0f6a3619a0be5a230b5806545648baf88d0a85fe434c3e1a0784b"
    },
    {
      "path": "backend/tests/test_iteration60_completion_date.py",
      "bytes": 9871,
      "sha256": "b860fdea5b562c8ed5d1e1d4b8319bf89279fd977b1cc646fd016049cdf58904"
    },
    {
      "path": "backend/tests/test_iteration61_ai_unify.py",
      "bytes": 3915,
      "sha256": "38457e0fc64fc0454a99097561456ce2d88d7eecb534c3759366a203d284be7d"
    },
    {
      "path": "backend/tests/test_iteration62_tax_year_scope.py",
      "bytes": 3989,
      "sha256": "9bed8c8d3c9d27174fa754848507ee425f4458ae606a1aa954a9b0f7bc1d274d"
    },
    {
      "path": "backend/tests/test_iteration63_ai_filtering.py",
      "bytes": 4877,
      "sha256": "0d8b98e03b2460c05806ca6e1b38feaac70c6918bf220e004c0c4ef78d279217"
    },
    {
      "path": "backend/tests/test_iteration63plus_material_extraction.py",
      "bytes": 5768,
      "sha256": "1a34e3d6e0d078ca4776b69584380cee22cd1aa035406b08e68d5347f601f472"
    },
    {
      "path": "backend/tests/test_iteration65_conversion_rate.py",
      "bytes": 3960,
      "sha256": "247c7fd948610eb75c128a465362213abc69d8d671435ebc8d362c26e05fef3c"
    },
    {
      "path": "backend/tests/test_iteration65plus_funnel_bridge.py",
      "bytes": 4381,
      "sha256": "ff74e74c2092387a3edb32d29218c6408dc9ed9132bd94e0291e7be51334ec98"
    },
    {
      "path": "backend/tests/test_iteration66_whatsapp_sort_funnel.py",
      "bytes": 4976,
      "sha256": "1fe36e4afba1633321e86e3d8616075dbf9726f1c3e89d06476ef95e9f95a675"
    },
    {
      "path": "backend/tests/test_iteration67_seo.py",
      "bytes": 3582,
      "sha256": "6e46b60620aa67a24d778b7661b3fabd7b3854328fdacd96ca13d427b601f48f"
    },
    {
      "path": "backend/tests/test_iteration68_seo_and_opportunities.py",
      "bytes": 4565,
      "sha256": "f37971487a46390821ba8b75480274cb84542cdd23335681e45af94f7c9079eb"
    },
    {
      "path": "backend/tests/test_iteration69_review_suppression.py",
      "bytes": 6464,
      "sha256": "9fb960fa9bb40ad8eb2d6156972dc9e7372fd1bf1d27fa0dc3e5f03be9f2a1ca"
    },
    {
      "path": "backend/tests/test_iteration71_reviews_alias.py",
      "bytes": 1769,
      "sha256": "e05155ce60be0efe9292e10a9f512cab99565d86565104de5b9306c49ea3b743"
    },
    {
      "path": "backend/tests/test_iteration72_traffic_invariant.py",
      "bytes": 2570,
      "sha256": "597e8cd264fdc5afe912e8ee7e762deca17e504679d1bc1fd23f8061b110fc05"
    },
    {
      "path": "backend/tests/test_iteration75_payment_schedule.py",
      "bytes": 13220,
      "sha256": "df8b1b7ef06dc76af43fe618483c8646992117a5c05ac742329e2d6e33eaa225"
    },
    {
      "path": "backend/tests/test_iteration76_cookie_auth.py",
      "bytes": 9598,
      "sha256": "26da808564321f0de7a0e6b9448f53590537c17bc860eb3bd5387903878f45e8"
    },
    {
      "path": "backend/tests/test_iteration77_stage_summary.py",
      "bytes": 2749,
      "sha256": "a164041a98a72832ada51ccf80811065408e598d5e96f82ffbf171337b15e662"
    },
    {
      "path": "backend/tests/test_iteration82_enquiry_wording.py",
      "bytes": 5517,
      "sha256": "9b8d95013da0085e897ba903334f6f20b890b45ddc6464fde994afa3d0e9b008"
    },
    {
      "path": "backend/tests/test_iteration83_ai_wording.py",
      "bytes": 4323,
      "sha256": "660286a3b641fbbf525915fb46c30e583a3df95e5c2c95b8c5ce641e59e8660d"
    },
    {
      "path": "backend/tests/test_iteration84_heic_upload.py",
      "bytes": 7480,
      "sha256": "b72b0f52273910b2919fa130398802e78a17767984db960a1c3fa295a769f499"
    },
    {
      "path": "backend/tests/test_iteration86_service_gallery.py",
      "bytes": 4010,
      "sha256": "b20f5ce97fb1d85fcdb7b733e254b4e6a96bda525459ded60e483b2d77c624dc"
    },
    {
      "path": "backend/tests/test_iteration89_publish_to_gallery.py",
      "bytes": 6528,
      "sha256": "d3ae25f67932de6f6a40de0c3bd69526c819d49c1cb70763f772d27674c5ca88"
    },
    {
      "path": "backend/tests/test_iteration90_ai_chat.py",
      "bytes": 5936,
      "sha256": "7b39f31fbe2fc56766ac22b0b9fde31fec8d24a50d1fae88b5ab338765f3d7b6"
    },
    {
      "path": "backend/tests/test_iteration91_connector_cleanup.py",
      "bytes": 10180,
      "sha256": "633566dddd0fe599fc2f815427aa30060e1861a3f78a9864b4ef052a57c1b683"
    },
    {
      "path": "backend/tests/test_iteration9_features.py",
      "bytes": 16311,
      "sha256": "1188fa87da14f4fe3f31384a83dcca316d072b3b27f2c830fc73e09ee61ed134"
    },
    {
      "path": "backend/tests/test_job_stage_update.py",
      "bytes": 23336,
      "sha256": "c7afdf68cc3c97de9adc7434544d6044dff7acbcc64da1d2257ef0b68ad86138"
    },
    {
      "path": "backend/tests/test_materials_catalogue.py",
      "bytes": 20207,
      "sha256": "1b57513b64491bbf32704254b1cc137d1c92949e0fb8de432ce8e7a164ea4fa1"
    },
    {
      "path": "backend/tests/test_metrics_api_iteration93.py",
      "bytes": 5434,
      "sha256": "4eb14345a85c91528ef9426c30b4d45360150689004bbcdf1cd9d5a0cefb1dca"
    },
    {
      "path": "backend/tests/test_metrics_reconciliation.py",
      "bytes": 7957,
      "sha256": "5d588898936cb359a291530597e8e599dbcc388ac91c19cadc631a88f642a42d"
    },
    {
      "path": "backend/tests/test_object_storage.py",
      "bytes": 12088,
      "sha256": "2c961067f8a6889db0cb92f41d4c7c7a170fceb6bfeb32bd980b846d557dcbb8"
    },
    {
      "path": "backend/tests/test_opportunities.py",
      "bytes": 13525,
      "sha256": "e910c031f3c79f31683376795e95ce80839602c1257ee113b1dcc68a9ba2309c"
    },
    {
      "path": "backend/tests/test_phase12.py",
      "bytes": 6482,
      "sha256": "fd02b6bf6c7956716643b88a34603209d439ee71d4e10af6bc2bb11862f71f9e"
    },
    {
      "path": "backend/tests/test_phase2_site_mode_eligibility.py",
      "bytes": 10797,
      "sha256": "304fb39eee37376cb68aac147bbf9e8ea56e9401e3d645b4f61cc6a06875acca"
    },
    {
      "path": "backend/tests/test_phase2_workflow.py",
      "bytes": 16303,
      "sha256": "a97ae45dd47ebb001f9e8785b9bf7661bc9b93f026e934886bd0dd2cc4ebcdca"
    },
    {
      "path": "backend/tests/test_phase3_customer_dedup.py",
      "bytes": 27801,
      "sha256": "1aaf657d89d40aeb33ba93af7375ecac78b6b8fe7bee6ca927ba0ac00a001d27"
    },
    {
      "path": "backend/tests/test_phase3_disabled_state.py",
      "bytes": 11581,
      "sha256": "b5d30ee15bae761496df6288a555a2677f49451d61996840eec325b3088d5c82"
    },
    {
      "path": "backend/tests/test_phase3_hardening.py",
      "bytes": 16838,
      "sha256": "c5710945e6502a946722508c241ab29d2a4e655de7df2b148a410ab9cfd2752b"
    },
    {
      "path": "backend/tests/test_phase3_placeholder_normalization.py",
      "bytes": 9147,
      "sha256": "2044ef3fdeb75db5f7cb8d82b313d073fbc756e2835c79f91b9918643e50b1b9"
    },
    {
      "path": "backend/tests/test_phase5_csrf.py",
      "bytes": 5406,
      "sha256": "d6c7d1c0d4619b5df0bf2d32d7f1780c6be4627e7951f7d0572131a11a096793"
    },
    {
      "path": "backend/tests/test_phase5_live_compat.py",
      "bytes": 8470,
      "sha256": "f18356fc313d63a934c4c1b5410591f9dc3695f4a3b7cea3144fab0f1bd4e1e9"
    },
    {
      "path": "backend/tests/test_phase5_recovery_containment.py",
      "bytes": 10074,
      "sha256": "c4a13bed2177e6bc1060b77619c6dc0f92e65824e59dc39d1841878ee85ebc35"
    },
    {
      "path": "backend/tests/test_phase5_security.py",
      "bytes": 13640,
      "sha256": "2dcef4f7b552a316b90280c78ea115372b8257ec309b37f497849345527389fd"
    },
    {
      "path": "backend/tests/test_phase5_zero_write.py",
      "bytes": 14734,
      "sha256": "404c4133b88ff6ab3ac9112d486a4b74d7107535e6cd252100e3cf32f872ec2f"
    },
    {
      "path": "backend/tests/test_phase5a_activation.py",
      "bytes": 7078,
      "sha256": "134ff00aee458b8c63a051a2694d1065133fa897f5833b1e78a63f50ec3f02d2"
    },
    {
      "path": "backend/tests/test_pipeline.py",
      "bytes": 13804,
      "sha256": "a5746d98d2fcc798d336df2cec322beb792298f5b60593f36731857e43b1b55f"
    },
    {
      "path": "backend/tests/test_pwa_and_tags.py",
      "bytes": 8260,
      "sha256": "2be0ed45c0e82126198dcd0a58883df1cb9135456b0caed3b3588a84822ca282"
    },
    {
      "path": "backend/tests/test_quotes_invoices.py",
      "bytes": 15955,
      "sha256": "ce7f87a518f93c12be0f0dd54b18b9fb44ca1790a53cd27f7e40d0e524b1f78a"
    },
    {
      "path": "backend/tests/test_site_invoice_generation.py",
      "bytes": 15389,
      "sha256": "23879a9daf445dd7a789843d8df0dd52543783c5aa3d23b81670696a8bb9c4ab"
    },
    {
      "path": "backend/tests/test_site_mode.py",
      "bytes": 11057,
      "sha256": "be420289c805df5cb79655a66b0601fbaf0007a37447ffe19c7a37e8089a7294"
    },
    {
      "path": "backend/tests/test_site_mode_pwa.py",
      "bytes": 14757,
      "sha256": "4165cc567ec0a09d5be5fb208f2c4da413f3a18d4f08165b296813095be5ef39"
    },
    {
      "path": "backend/tests/test_site_mode_time_entries.py",
      "bytes": 9738,
      "sha256": "6676f929e1835e058ee40f1fe9c76a95f6ebee5138518a130ec0e8c9b90e6bac"
    },
    {
      "path": "backend/tests/test_smarter_ai_weekly_reports.py",
      "bytes": 17199,
      "sha256": "ce61b138211187496c60c0aa425e5d00feec3a7c86506802fb47f7fde75dc265"
    },
    {
      "path": "backend/tests/test_staged_payment_financials.py",
      "bytes": 8340,
      "sha256": "6a72123668ba1a55fd66dff361142f3b4bef253d79a25cb6f6a1add9c54a9821"
    },
    {
      "path": "frontend/README.md",
      "bytes": 3359,
      "sha256": "70eafbc7a5fd466aa3213b5a7e1b2a41383cbe5d4e6fc5f4582efc58bdb509d1"
    },
    {
      "path": "frontend/craco.config.js",
      "bytes": 3708,
      "sha256": "34b586bc537a677809d07b27c6300c0531be612cb940cd811b6f5e98832014b0"
    },
    {
      "path": "frontend/jsconfig.json",
      "bytes": 116,
      "sha256": "696e14c6f246163a299d7ce3bd1003d52bc0fd4d97629ca468fbd38e8fe1f72f"
    },
    {
      "path": "frontend/package.json",
      "bytes": 3324,
      "sha256": "58054e4c3ae01be4bc1cb6fc010fa71e826823de90195fe1b912be0666fd9b91"
    },
    {
      "path": "frontend/plugins/health-check/health-endpoints.js",
      "bytes": 7412,
      "sha256": "cd02f57c2f5921a7134e8de6e794a0f46ba597c592d17bc614d7250f7023cb03"
    },
    {
      "path": "frontend/plugins/health-check/webpack-health-plugin.js",
      "bytes": 3141,
      "sha256": "9dc8e0a6fe52decded5ec55ea9f6864ec4a9bb456aa4e8a8524067d9ed58f8a3"
    },
    {
      "path": "frontend/plugins/visual-edits/babel-metadata-plugin.js",
      "bytes": 31073,
      "sha256": "10e179033ef79f3c4fcb7010279fa18b330844916fc30cec86cc6a1e419406fa"
    },
    {
      "path": "frontend/plugins/visual-edits/dev-server-setup.js",
      "bytes": 19214,
      "sha256": "60885bb4ca6cf7ff7ac5966abd6b039ce8eeac84d7716099b59d41bfe739ad11"
    },
    {
      "path": "frontend/postcss.config.js",
      "bytes": 82,
      "sha256": "251ecddd4672c9cf467547e3dc535de00ad2129df26e7e7ae728fa4e5ac45fc5"
    },
    {
      "path": "frontend/public/index.html",
      "bytes": 24955,
      "sha256": "c483b7329526b1335dbaa1272f3552d99731b244e926fa0187c48fc87416f3e9"
    },
    {
      "path": "frontend/public/service-worker.js",
      "bytes": 4843,
      "sha256": "24830e9cf50473e79ce5664c9cb320548e86975dfea9a27188a63daf86d40dd3"
    },
    {
      "path": "frontend/src/App.css",
      "bytes": 26,
      "sha256": "d6ef5e94c775aed301f1ec1ae6b9e1537bbed53de101d00a6ae71fed5cb10025"
    },
    {
      "path": "frontend/src/App.js",
      "bytes": 6137,
      "sha256": "818fde303799f350147714b4ad62ebaabdfd8ef919675c3f4669e0ed397e5e34"
    },
    {
      "path": "frontend/src/buildVersion.js",
      "bytes": 301,
      "sha256": "804bfcef46c8a848e5200d5e7c247f455283ab2bc97b14e0ed754f679713a987"
    },
    {
      "path": "frontend/src/components/CookieConsent.jsx",
      "bytes": 8804,
      "sha256": "691ef660f10a7483591f59f415c7b0c1b8d5d03b8cf2b507de99eefd03c3dd30"
    },
    {
      "path": "frontend/src/components/NoindexHead.jsx",
      "bytes": 3261,
      "sha256": "a5b4dc64c77f7a3e0e0489f71f1a766c16cb4c8a6658a04d7721530248c9be5a"
    },
    {
      "path": "frontend/src/components/ServiceGalleryDialog.jsx",
      "bytes": 4207,
      "sha256": "8ed7c369c662d5a9b3b4b4cd42a799dabb6bbfce2344a5ef4ea251f903b12c5d"
    },
    {
      "path": "frontend/src/components/admin/AIAssistantTab.jsx",
      "bytes": 47463,
      "sha256": "a267c01563830b981be7093748c5acaf2a11e4e2209eb9465b383682c39b3abd"
    },
    {
      "path": "frontend/src/components/admin/AIBusinessChat.jsx",
      "bytes": 6456,
      "sha256": "1e679b69a54baba27b7fa7a1a865b82f394b3cf138ebc029cd6e1ed96849d945"
    },
    {
      "path": "frontend/src/components/admin/AIInsightsPanel.jsx",
      "bytes": 17618,
      "sha256": "c359932f0b2256ca1ccedba4ba056c6a654f20bd5f32dc7afcb171d7bf1f5c36"
    },
    {
      "path": "frontend/src/components/admin/AIWordingButton.jsx",
      "bytes": 6035,
      "sha256": "728184be5c78d8adcc36439abf3c11a02d9aafd6c19ed4245c4d8d76445d9660"
    },
    {
      "path": "frontend/src/components/admin/AnalyticsTab.jsx",
      "bytes": 70366,
      "sha256": "822ac61127151ecb284f31605420bd3d9bbfb57ae0851afabf8c568527edc473"
    },
    {
      "path": "frontend/src/components/admin/CalendarSection.jsx",
      "bytes": 52654,
      "sha256": "ee423caefe9a5ccfcaf9c714db32212bc84ea51dc1883cf1cdac49237deffe17"
    },
    {
      "path": "frontend/src/components/admin/CataloguePicker.jsx",
      "bytes": 6831,
      "sha256": "8775269b61412aa5027f59a63da27806dfc6e882d3afee0e4eb49f0f58abcc6e"
    },
    {
      "path": "frontend/src/components/admin/ChatGPTConnectorCard.jsx",
      "bytes": 5337,
      "sha256": "db9cf89df0abc0f6b019c6b694cbcf5880a6b7ffb81ebf8e1f41739c0ce07b30"
    },
    {
      "path": "frontend/src/components/admin/CustomerTimeline.jsx",
      "bytes": 5700,
      "sha256": "156a18c57f45136ca45f1a993d3dd89771f98153161e53e908d797809ebaf450"
    },
    {
      "path": "frontend/src/components/admin/CustomersTab.jsx",
      "bytes": 10049,
      "sha256": "087214ab26d85f77984bc16cab296b10781dbbc508046ca4637527bb20545888"
    },
    {
      "path": "frontend/src/components/admin/DashboardDialogs.jsx",
      "bytes": 171410,
      "sha256": "ad5c3084851eb295f46df87e68f799855467b00531266834c35750beaac68dd9"
    },
    {
      "path": "frontend/src/components/admin/ErrorBoundary.jsx",
      "bytes": 2201,
      "sha256": "c785195fae8bc07960e1c4254584c69add80dfe0fcd9cce1212f9c13de486bd3"
    },
    {
      "path": "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
      "bytes": 10673,
      "sha256": "086d365937eb78fc364f504636031c9b9a6bcc1a8cb5c8485c5ad7c1a4ba0142"
    },
    {
      "path": "frontend/src/components/admin/FeedbackTab.jsx",
      "bytes": 24198,
      "sha256": "b6d16b34e07d3394e983f3fe79fe8ce80a36187b229f85b7bcc0e7481cdf119c"
    },
    {
      "path": "frontend/src/components/admin/GilbertsTab.jsx",
      "bytes": 26331,
      "sha256": "41cb32aa160b057c538ef3a6d24dee9066bddb9e49a218130ba81d6b282c2c96"
    },
    {
      "path": "frontend/src/components/admin/GrowthOpportunitiesPanel.jsx",
      "bytes": 22938,
      "sha256": "bd758ff03f8d6941498313227455b983505183a7722bd5e60e4dc14a9c3338de"
    },
    {
      "path": "frontend/src/components/admin/ImageUploader.jsx",
      "bytes": 8745,
      "sha256": "fe69e2e52239bb1cba11d00d6d60e4a13cb3614ce391316dc7b3acd33028923a"
    },
    {
      "path": "frontend/src/components/admin/InvoiceBulkDates.jsx",
      "bytes": 7463,
      "sha256": "57d9599366992b3d0307d3849ad491bb2a8f6733a89b3f1bffb14c833b15f83e"
    },
    {
      "path": "frontend/src/components/admin/InvoiceBulkUpload.jsx",
      "bytes": 15449,
      "sha256": "02830bd35f13aac3f8c4a9caf5368ac856a05129ac7d8dca26e3018b10fdf167"
    },
    {
      "path": "frontend/src/components/admin/InvoiceProfitabilityWidget.jsx",
      "bytes": 2782,
      "sha256": "bbab751e5359b9b72c17eaff497a0d48c537f759cf97adba07a3dbdb926466f4"
    },
    {
      "path": "frontend/src/components/admin/JobMaterialsPanel.jsx",
      "bytes": 8358,
      "sha256": "cd61dbbb8bdc652bc9f2e86da584d260d29976a788752527ee79d358ae4d9719"
    },
    {
      "path": "frontend/src/components/admin/JobTimePanel.jsx",
      "bytes": 13465,
      "sha256": "be37733f7a3dae348c01956dda6fcf2b04f05b04062cee4fcd62559cca88794c"
    },
    {
      "path": "frontend/src/components/admin/JobsTab.jsx",
      "bytes": 25140,
      "sha256": "84e9b97ef1c4877d2d3b09aff2a01705042bebb6de787e7ad961032622ef9b4f"
    },
    {
      "path": "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
      "bytes": 15895,
      "sha256": "fcdcb05c219b1dede5b040bb1760d2a0c3336a1554f93ea20d300748027ca250"
    },
    {
      "path": "frontend/src/components/admin/MaterialsCsvImport.jsx",
      "bytes": 15371,
      "sha256": "1bd522ad5eb3dcfa260196114656e889ac1fdf55ab0cc074c30b48a1eff2638c"
    },
    {
      "path": "frontend/src/components/admin/MaterialsTab.jsx",
      "bytes": 37721,
      "sha256": "d3e334c1f7c5a1faa20657d9fe832c1ffe90df09110f30b3618e966a915c69ad"
    },
    {
      "path": "frontend/src/components/admin/MetricInfo.jsx",
      "bytes": 2015,
      "sha256": "604b0fcb258176d0f12664ff42f7602d88d568c6b3f3feca8b026ebc4f5eb21a"
    },
    {
      "path": "frontend/src/components/admin/PaymentScheduleEditor.jsx",
      "bytes": 22152,
      "sha256": "6325aa20bdbdb07e0b9217d9da83e838c312a062a8779a5a2a8489babe832f90"
    },
    {
      "path": "frontend/src/components/admin/PipelineTab.jsx",
      "bytes": 49105,
      "sha256": "bf81636d216fe43f70dee477d0d8df748146bcc2bd8b2d88349fa0dcdfe72050"
    },
    {
      "path": "frontend/src/components/admin/PortfolioTab.jsx",
      "bytes": 21776,
      "sha256": "66f74d429543077f94e96d44314ac5f0f8eea0192b89cb286eff1d4f692244fd"
    },
    {
      "path": "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
      "bytes": 23416,
      "sha256": "6ebdbbc86aa937271a095dd8e7dd576611e3cdde3f465cd953a4580c3e753a4f"
    },
    {
      "path": "frontend/src/components/admin/ProjectCommandCenter.jsx",
      "bytes": 10419,
      "sha256": "89ef36c457907a365bd95f9d791d1f7fe8ee91b6b8317aa63a8ca3620e03d167"
    },
    {
      "path": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "bytes": 77305,
      "sha256": "dfd85fb3cf6be2efa601dea39be077d3c52e0212e22ae27d31155ca034c43fcf"
    },
    {
      "path": "frontend/src/components/admin/RichTextEditor.jsx",
      "bytes": 5246,
      "sha256": "a5f4a0b65a49d5be12931b71009374286a0abf806f6722d7b56a5f5379d268c9"
    },
    {
      "path": "frontend/src/components/admin/SettingsTab.jsx",
      "bytes": 38981,
      "sha256": "645137b15c49cc33fe2a3912a0acd9d092fdf3b7e4fb9c118889b44b90b86c91"
    },
    {
      "path": "frontend/src/components/admin/SiteEditorTab.jsx",
      "bytes": 47661,
      "sha256": "ea19ad154a9ad191be7564691e475f8b3ff2d16de8a5c96153f705300aea0b29"
    },
    {
      "path": "frontend/src/components/admin/SiteModeTab.jsx",
      "bytes": 41893,
      "sha256": "6306cea77470fc9093b0273dd60ee8569522af510becc78c28225032b1a7f98d"
    },
    {
      "path": "frontend/src/components/admin/StorageCleanupCard.jsx",
      "bytes": 3640,
      "sha256": "5ae4e0a773386bcf2f30c4c88fae45b6da73d8254c64550cc7754758bf40241f"
    },
    {
      "path": "frontend/src/components/admin/WhatsAppButton.jsx",
      "bytes": 3724,
      "sha256": "ef921c0ebe8a3271795afb43ef99985a4d09bc46c29df9f1aec06c57b7bad10d"
    },
    {
      "path": "frontend/src/components/public/PublicFooter.jsx",
      "bytes": 7098,
      "sha256": "69b9322f0a1263539041e058625faf06d845e45bd702ecb801714d6298d3f392"
    },
    {
      "path": "frontend/src/components/public/PublicNav.jsx",
      "bytes": 1836,
      "sha256": "d0191a6d42dc0ef711de1413cac03e2839048f979d2312c19881173d8733cd42"
    },
    {
      "path": "frontend/src/components/ui/accordion.jsx",
      "bytes": 1615,
      "sha256": "b47533b3783b8149550b8481e4ae93d54bdcbc51d434793c176b0aec5558ee1c"
    },
    {
      "path": "frontend/src/components/ui/alert-dialog.jsx",
      "bytes": 3461,
      "sha256": "a20098cdc2eb2b5915575d3f0fb7a3e8e6c1035c7eef77144f3fc389e0fdbda0"
    },
    {
      "path": "frontend/src/components/ui/alert.jsx",
      "bytes": 1335,
      "sha256": "c5baf27fb6a4bf130236fa0f336c21084fee192e8215bb6b20c87436c27f3b38"
    },
    {
      "path": "frontend/src/components/ui/aspect-ratio.jsx",
      "bytes": 140,
      "sha256": "08b0aa0b05efc573c7d63363c03e83d4b101bfeb54140764e96ddea30659cfcc"
    },
    {
      "path": "frontend/src/components/ui/avatar.jsx",
      "bytes": 1029,
      "sha256": "dc91f6b15da007904343e580ceeccc58fba37f8c207e12b1edd3057820805475"
    },
    {
      "path": "frontend/src/components/ui/badge.jsx",
      "bytes": 990,
      "sha256": "380dcda78ff8fdd80c82b89cb7dd38ffd84c355735fc8f16300ff647e15988aa"
    },
    {
      "path": "frontend/src/components/ui/breadcrumb.jsx",
      "bytes": 2269,
      "sha256": "bb43d4d07119e0cf1a458feac2c9cfb3946b33813b12e11e576d9eb7dcddf189"
    },
    {
      "path": "frontend/src/components/ui/button.jsx",
      "bytes": 1662,
      "sha256": "e933a3f77c7ed8bf7186ca1fc049b940bd1e80e75b34eb9853dbb9fae7af9a47"
    },
    {
      "path": "frontend/src/components/ui/calendar.jsx",
      "bytes": 2849,
      "sha256": "235b31ac855e8a373d683c1175f14afb065ee3f00a0f4b19e89311665e0934ea"
    },
    {
      "path": "frontend/src/components/ui/card.jsx",
      "bytes": 1440,
      "sha256": "8ab6f42e722e9c51752ce2f14aabb2696bddc0b6818041fb8f313f670955c2c4"
    },
    {
      "path": "frontend/src/components/ui/carousel.jsx",
      "bytes": 4811,
      "sha256": "62842d0a01459ffd8d9a83b0e5a34b8cc639eb2d06a7076c8488b7ac56864cdd"
    },
    {
      "path": "frontend/src/components/ui/checkbox.jsx",
      "bytes": 1047,
      "sha256": "9bf28b8eba358394a1d1a48ca172e46062b91232adddf613632fd6af4417a7f1"
    },
    {
      "path": "frontend/src/components/ui/collapsible.jsx",
      "bytes": 315,
      "sha256": "6f5be8ba164c177759bf63cc25ad4d49391f162f6784ba624d72e5d5c0c0dde2"
    },
    {
      "path": "frontend/src/components/ui/command.jsx",
      "bytes": 3893,
      "sha256": "c1cc8d4ba2b7cc890ffa45c4e5bfc8a1e647f6dd859e9057cb7fedd6621a5e1d"
    },
    {
      "path": "frontend/src/components/ui/context-menu.jsx",
      "bytes": 6175,
      "sha256": "46884050ac738ba6f7324425fa491f9b79140d27571318cf4473ddedcdc7b8c6"
    },
    {
      "path": "frontend/src/components/ui/dialog.jsx",
      "bytes": 3265,
      "sha256": "2473f992be0df7bc3cefcb94c2b0bffbed28edecb55a4fd4630a5723e4595593"
    },
    {
      "path": "frontend/src/components/ui/drawer.jsx",
      "bytes": 2345,
      "sha256": "ad946a1e3d6976f5da19f6fbdaa8a65dc96c6cbce926d1a60889ef5ec449e44c"
    },
    {
      "path": "frontend/src/components/ui/dropdown-menu.jsx",
      "bytes": 6349,
      "sha256": "4d741af876d4337bcc4bf4621093ed7f6a7e9d982286bbb07ef8f8434c7bbb54"
    },
    {
      "path": "frontend/src/components/ui/form.jsx",
      "bytes": 3121,
      "sha256": "68379f589cf2c031104cc39fd944713d611e31e26213be78074eb853e19dbcdf"
    },
    {
      "path": "frontend/src/components/ui/hover-card.jsx",
      "bytes": 1109,
      "sha256": "d72f4c6169a6cd06b18d279ae31e73b790f7aba6a38c61442952c01e04cc32af"
    },
    {
      "path": "frontend/src/components/ui/input-otp.jsx",
      "bytes": 1809,
      "sha256": "485ea4a1a4ad29e68ab3671eaccaa7b972b47d266e87f767c6137ccdd0f2d0b7"
    },
    {
      "path": "frontend/src/components/ui/input.jsx",
      "bytes": 688,
      "sha256": "7c9f0c756530ae1dbe3b1424f09e32e3f54323826b2f2d817b13c865f96309ad"
    },
    {
      "path": "frontend/src/components/ui/label.jsx",
      "bytes": 525,
      "sha256": "37c6425d2a5c798ade4e60f89f86054d703433a8977e12d796de2b5bb4e3d0b7"
    },
    {
      "path": "frontend/src/components/ui/menubar.jsx",
      "bytes": 6874,
      "sha256": "9d170686eb1c56b5981e7108d6108498009fd55abffa1ae4b89d38b44292788b"
    },
    {
      "path": "frontend/src/components/ui/navigation-menu.jsx",
      "bytes": 4299,
      "sha256": "5e4efd6acb3836f19205aeca1373da81cf48c35be6fedd62326d704c2ee2a921"
    },
    {
      "path": "frontend/src/components/ui/pagination.jsx",
      "bytes": 2322,
      "sha256": "1d519fc3ba1c8c6cf7f2d30c98739ecba2fa7af35cbc024d6793785e7a6d65c8"
    },
    {
      "path": "frontend/src/components/ui/popover.jsx",
      "bytes": 1218,
      "sha256": "69b873ee7ea22f6ce925fc5db1dfb3ab3032932c732e8ea3d4a4118024de4dc8"
    },
    {
      "path": "frontend/src/components/ui/progress.jsx",
      "bytes": 653,
      "sha256": "2d074c6026cd5ca44ef44b9027f267612c39877a7d2eb4a3faa387594c3eb37a"
    },
    {
      "path": "frontend/src/components/ui/radio-group.jsx",
      "bytes": 1133,
      "sha256": "4e1e8860ca64733614431a9aa1694d430538478e1fa6859b1e6f65348152876b"
    },
    {
      "path": "frontend/src/components/ui/resizable.jsx",
      "bytes": 1556,
      "sha256": "eec5a9ea2861a3946063586f101d4b3d6615cd8e0a00f2834f80aed3bf0cb2c5"
    },
    {
      "path": "frontend/src/components/ui/scroll-area.jsx",
      "bytes": 1362,
      "sha256": "3de4bed34be51a940243b0fbf8c6d9324ecb416a91a919d65ca18d15a7ba32a1"
    },
    {
      "path": "frontend/src/components/ui/select.jsx",
      "bytes": 4771,
      "sha256": "143d010526ea9e39183fdf1c0bffc217424c8fc21fa62d1802270d39bcc47b9c"
    },
    {
      "path": "frontend/src/components/ui/separator.jsx",
      "bytes": 600,
      "sha256": "2c82247abd573d0f4a93eb259166e3b778365b58c0d18921b4739d5ba4b29e7e"
    },
    {
      "path": "frontend/src/components/ui/sheet.jsx",
      "bytes": 3535,
      "sha256": "8d2cc6801dd7a47fbacbe2bc78ed6b564dfe12adf188af111bc03a78e5efe2d8"
    },
    {
      "path": "frontend/src/components/ui/skeleton.jsx",
      "bytes": 225,
      "sha256": "78dad1ec71e4fc2c0060dd244ee68b2f9e7fc42ae680dab4f310e2ad8f17b741"
    },
    {
      "path": "frontend/src/components/ui/slider.jsx",
      "bytes": 914,
      "sha256": "1761bfaa0a06480b76b31511e4a5c24903b407732e027fc11ad615dd3d93a562"
    },
    {
      "path": "frontend/src/components/ui/sonner.jsx",
      "bytes": 797,
      "sha256": "20962c4968b5792da4b408680321180f1c9b8f9cf322695d5173c0ef25132b40"
    },
    {
      "path": "frontend/src/components/ui/switch.jsx",
      "bytes": 1025,
      "sha256": "880e95637cc1d90ef4476f79114afd2fa7b5f6e5da1f49a70e0efc1f84aa0c8a"
    },
    {
      "path": "frontend/src/components/ui/table.jsx",
      "bytes": 2231,
      "sha256": "301509bb8337184f1b299cb15b8d4f8ec8f0d3bbc17a2ffdf33ff58f7eaa444e"
    },
    {
      "path": "frontend/src/components/ui/tabs.jsx",
      "bytes": 1529,
      "sha256": "57591bdfb3fa931b06edcf4168b6881a79785c674ad0618003d12cd656072350"
    },
    {
      "path": "frontend/src/components/ui/textarea.jsx",
      "bytes": 585,
      "sha256": "6b2c6dd8023a32be3b52af960d7615018488c5601fb05cec97ed76d1141ae2f4"
    },
    {
      "path": "frontend/src/components/ui/toast.jsx",
      "bytes": 3829,
      "sha256": "1865542d8648bb1207bdf3020393387f0a42ca1f5f9f5a8ffab4bb35598c1c5e"
    },
    {
      "path": "frontend/src/components/ui/toaster.jsx",
      "bytes": 774,
      "sha256": "7dd63e25d99c02b93b3868eef5b0c261ecc63b5f5542c4bf7155731ec234ef5d"
    },
    {
      "path": "frontend/src/components/ui/toggle-group.jsx",
      "bytes": 1268,
      "sha256": "f40062b4037c151c9bba1b5de1ce60c60ce5b4dc6dc24f8efab85b382a3129fb"
    },
    {
      "path": "frontend/src/components/ui/toggle.jsx",
      "bytes": 1324,
      "sha256": "8c563045f231bfa2ca8cde62085f00c0600fa558a60d8c14ea3a1cb5c9c644c5"
    },
    {
      "path": "frontend/src/components/ui/tooltip.jsx",
      "bytes": 1127,
      "sha256": "6f5b14ca183b6b4b64427102af2c0773dbde38658a568aaa53ef4de4c7b8045e"
    },
    {
      "path": "frontend/src/contexts/AdminDashboardContext.jsx",
      "bytes": 343,
      "sha256": "705bf0e7660ad053c4b4483817a7f7c63b89ff91f0d2841c890364fadd90f077"
    },
    {
      "path": "frontend/src/hooks/use-toast.js",
      "bytes": 3085,
      "sha256": "767e0227c5c9406b5d00e25a57c6d01e9f6e083d36e803ccb0a5e260992a5225"
    },
    {
      "path": "frontend/src/hooks/useOfflineQueue.js",
      "bytes": 3057,
      "sha256": "97c86194d27c8216bc1d598e4671ab83db51bd045b760c5f51fa73e7e427d171"
    },
    {
      "path": "frontend/src/hooks/usePublicData.js",
      "bytes": 2149,
      "sha256": "020a624833b66339b6c45d3e9d6f2a4e64ff27c17af081fc32940b9ed2ab47e7"
    },
    {
      "path": "frontend/src/hooks/useSeoHeadTags.js",
      "bytes": 4568,
      "sha256": "b154bd3ca6ba3eac857faa13eab440ca6aa651e4bcfce74fef4ea1826577c494"
    },
    {
      "path": "frontend/src/index.css",
      "bytes": 1693,
      "sha256": "b86cef1d2d7a26ed8dfe352e2aa8b9dd80b6354100818822f269f67e1e3c77f2"
    },
    {
      "path": "frontend/src/index.js",
      "bytes": 1864,
      "sha256": "cba9318f462420fdba71ab38512c21291261f12a33afbc4303e1f0ed1be69524"
    },
    {
      "path": "frontend/src/lib/__tests__/adminRouting.test.jsx",
      "bytes": 4948,
      "sha256": "dad8166117fe110a32bca9e68811ed80b1418cbaa274ceab918d87907fd9950e"
    },
    {
      "path": "frontend/src/lib/__tests__/headlineMetrics.test.jsx",
      "bytes": 2035,
      "sha256": "45cb3b7f70ec1e598fce917a05c44ba6e30b9c1c4ae4dd4cbd40fa7f8088aa7e"
    },
    {
      "path": "frontend/src/lib/__tests__/materialsCatalogue.test.jsx",
      "bytes": 8487,
      "sha256": "ee76fd33adedc0e78767652bfba4215b71e9e98a9cf6f1dd7a7dc7ed13f5c773"
    },
    {
      "path": "frontend/src/lib/__tests__/phase6aAccessibility.test.jsx",
      "bytes": 8376,
      "sha256": "364de5c7b398898c62a58acf8625406ff06bc9ba1896d211f8bc8fa23bda0650"
    },
    {
      "path": "frontend/src/lib/__tests__/publicSeo.test.jsx",
      "bytes": 9249,
      "sha256": "c47e257da136c39b8cb0846a85933e5a2e2507b091f09d5728b06e8c5301322a"
    },
    {
      "path": "frontend/src/lib/__tests__/siteModeTimeEntries.test.jsx",
      "bytes": 6111,
      "sha256": "ed6a4a27ea39c67fc8cf6bd153f03e5945fbb5b8d91053723a9ac06376550256"
    },
    {
      "path": "frontend/src/lib/adminSections.js",
      "bytes": 3984,
      "sha256": "0c8e84b5f90db6cc4349d976a874efb3a49a87d63e5152226c96ae298947fba7"
    },
    {
      "path": "frontend/src/lib/analyticsConsent.js",
      "bytes": 1362,
      "sha256": "8a454a2c7135a52e38843bff5fb0ef7adb3b90ece52d2ecbb530483ef63243f7"
    },
    {
      "path": "frontend/src/lib/constants.js",
      "bytes": 13904,
      "sha256": "7f5fea5c63e2db9bbbd98d2206f21cd8cda56b2180d4483aeeb8f3a053fd4242"
    },
    {
      "path": "frontend/src/lib/metricDefinitions.js",
      "bytes": 13669,
      "sha256": "fcfeed86dcabaf28d64fff0b152f3202b937e361c4e3bfb3f520385c84dedef0"
    },
    {
      "path": "frontend/src/lib/publicSite.js",
      "bytes": 2140,
      "sha256": "cecb7e6cfb9d981c3ab3836575e295545de1257564d6a2b45c85578a8ff2f1f0"
    },
    {
      "path": "frontend/src/lib/utils.js",
      "bytes": 137,
      "sha256": "5ba0ae526d768600bbfb4a4d345c47f6208cb941adbf456de80804a4cf938350"
    },
    {
      "path": "frontend/src/pages/AboutPage.jsx",
      "bytes": 16515,
      "sha256": "115c6c61242b1268280e58a3aff2273e6e8fd5ea823ab2990fb3ae9b3af333d0"
    },
    {
      "path": "frontend/src/pages/AdminDashboard.jsx",
      "bytes": 360438,
      "sha256": "43c8fcd5662f3a80c1155a8066a67817123b9bfbc8f599814eb875ac53cf6656"
    },
    {
      "path": "frontend/src/pages/AdminLogin.jsx",
      "bytes": 14882,
      "sha256": "c1673cc841cce6949f82433e581cce93f0286dc49518ddc77e5d2a01fc6f3045"
    },
    {
      "path": "frontend/src/pages/CookiePolicy.jsx",
      "bytes": 10095,
      "sha256": "605f80092dbe0973d3d33bd122472a44d622956e7e3725448ad530d0b149f3a5"
    },
    {
      "path": "frontend/src/pages/CustomerPortal.jsx",
      "bytes": 18080,
      "sha256": "56cce9f69c2fea7ef693c832608a583e9e7b33652a81a7b7f63baad2d5d2568c"
    },
    {
      "path": "frontend/src/pages/EnquiryPage.jsx",
      "bytes": 16862,
      "sha256": "7d20bcb9ece65e10c3e56545ec0e8b6725abaf11a24d68b190ca6e25cdcc6042"
    },
    {
      "path": "frontend/src/pages/FeedbackPage.jsx",
      "bytes": 14586,
      "sha256": "06ba1aab4b98af6c90c521c1e992c9f2452e160ad560f56cf0e08d65e97e3710"
    },
    {
      "path": "frontend/src/pages/GalleryDetailPage.jsx",
      "bytes": 11098,
      "sha256": "b0968a4d2a49daaa5919a15382c8dacdc1b5a0b683c62fbf384347369f27a6b3"
    },
    {
      "path": "frontend/src/pages/GalleryIndexPage.jsx",
      "bytes": 7292,
      "sha256": "839e4bdbb97c24aeac869a389516506acf7482a3d62d99b85ad98de14ef208c0"
    },
    {
      "path": "frontend/src/pages/LandingPage.jsx",
      "bytes": 34582,
      "sha256": "08d60db91dee4a5477549c31e3036a8703749fb32a5ad5ab5e733aaa75ea3ea5"
    },
    {
      "path": "frontend/src/pages/NotFoundPage.jsx",
      "bytes": 1757,
      "sha256": "777986aeb24a757a5661faebd7f82dbfcea1e187a9a85b26c26215b96ba507e8"
    },
    {
      "path": "frontend/src/pages/PortalSetup.jsx",
      "bytes": 6945,
      "sha256": "1f3fcbebbb7dff5692bb7d0b11cf4920f085a929dec25f8fc2f3700df05639eb"
    },
    {
      "path": "frontend/src/pages/PrivacyPolicy.jsx",
      "bytes": 10032,
      "sha256": "e18430109dda8d726c3ac913861c0b2f115b26d15f242f5e14869ceaea63d5de"
    },
    {
      "path": "frontend/src/pages/ReviewsPage.jsx",
      "bytes": 7004,
      "sha256": "3cc766cc0d61062c791129e508a61dbcdd8e948e5ca391186abffb42168c7442"
    },
    {
      "path": "frontend/src/pages/ServicePage.jsx",
      "bytes": 17392,
      "sha256": "c3d5dd2bf6130dda491b2ac3d83ceb910eab9b780e59b923c62c610863c23de6"
    },
    {
      "path": "frontend/src/pages/TermsConditions.jsx",
      "bytes": 9236,
      "sha256": "cbcf9a254ef8253c5d6f7a103a1fd73161a7889943ad6097c81732ccf3e64c11"
    },
    {
      "path": "frontend/src/setupTests.js",
      "bytes": 603,
      "sha256": "b7255af34a07a6be155f6600b65b7a29baf895ba4bdee44c1b4dbaab8c7cd432"
    },
    {
      "path": "frontend/tailwind.config.js",
      "bytes": 2013,
      "sha256": "2dffd76e8cc6702ddca8ad8340b043bfc90e21db74bbde6237dc48387319c0eb"
    },
    {
      "path": "frontend/yarn.lock",
      "bytes": 546295,
      "sha256": "89b41c0d89569a15d4a9326a29da39d7499f8aa0d8f40f5f8bbc6b89001b8f7f"
    }
  ],
  "backend_declared_routes": [
    {
      "file": "backend/email_guard.py",
      "line": 180,
      "method": "GET",
      "declared_path": "/admin/email-guard/status",
      "handler": "email_guard_status",
      "capability_ids": [
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/email_guard.py",
      "line": 185,
      "method": "POST",
      "declared_path": "/admin/email-guard/manual-test-window",
      "handler": "email_guard_manual_window",
      "capability_ids": [
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_chat.py",
      "line": 104,
      "method": "POST",
      "declared_path": "/admin/ai/chat",
      "handler": "business_chat",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_chat.py",
      "line": 174,
      "method": "GET",
      "declared_path": "/admin/ai/chat/sessions",
      "handler": "list_chat_sessions",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_chat.py",
      "line": 198,
      "method": "GET",
      "declared_path": "/admin/ai/chat/{session_id}/messages",
      "handler": "get_chat_messages",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_chat.py",
      "line": 206,
      "method": "DELETE",
      "declared_path": "/admin/ai/chat/{session_id}",
      "handler": "delete_chat_session",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_writer.py",
      "line": 38,
      "method": "POST",
      "declared_path": "/admin/ai/wording-assist",
      "handler": "wording_assist",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/ai_writer.py",
      "line": 79,
      "method": "POST",
      "declared_path": "/admin/ai/gallery-copy",
      "handler": "gallery_copy",
      "capability_ids": [
        "AI01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/analytics.py",
      "line": 13,
      "method": "POST",
      "declared_path": "/analytics/pageview",
      "handler": "track_page_view",
      "capability_ids": [
        "REPORT01",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/analytics.py",
      "line": 538,
      "method": "GET",
      "declared_path": "/admin/analytics",
      "handler": "get_analytics",
      "capability_ids": [
        "REPORT01",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/analytics.py",
      "line": 567,
      "method": "GET",
      "declared_path": "/admin/analytics/enhanced",
      "handler": "get_enhanced_analytics",
      "capability_ids": [
        "REPORT01",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 62,
      "method": "POST",
      "declared_path": "/admin/login",
      "handler": "login_admin",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 88,
      "method": "POST",
      "declared_path": "/admin/logout",
      "handler": "logout_admin",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 97,
      "method": "GET",
      "declared_path": "/admin/csrf-token",
      "handler": "get_csrf_token",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 105,
      "method": "POST",
      "declared_path": "/admin/forgot-password",
      "handler": "forgot_password",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 157,
      "method": "POST",
      "declared_path": "/admin/reset-password",
      "handler": "reset_password",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 205,
      "method": "POST",
      "declared_path": "/admin/verify-reset-token",
      "handler": "verify_reset_token",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 213,
      "method": "GET",
      "declared_path": "/admin/profile",
      "handler": "get_admin_profile",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 226,
      "method": "PATCH",
      "declared_path": "/admin/profile",
      "handler": "update_admin_profile",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 234,
      "method": "POST",
      "declared_path": "/admin/change-password",
      "handler": "change_password",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 242,
      "method": "GET",
      "declared_path": "/admin/all-admins",
      "handler": "get_all_admins",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 247,
      "method": "DELETE",
      "declared_path": "/admin/admins/{admin_id}",
      "handler": "delete_admin",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 256,
      "method": "POST",
      "declared_path": "/admin/admins",
      "handler": "create_admin",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 282,
      "method": "PATCH",
      "declared_path": "/admin/admins/{admin_id}",
      "handler": "update_admin",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/auth.py",
      "line": 295,
      "method": "PATCH",
      "declared_path": "/admin/admins/{admin_id}/color",
      "handler": "update_admin_color",
      "capability_ids": [
        "AUTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 132,
      "method": "GET",
      "declared_path": "/admin/blocked-days",
      "handler": "get_blocked_days",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 137,
      "method": "POST",
      "declared_path": "/admin/blocked-days",
      "handler": "create_blocked_day",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 158,
      "method": "DELETE",
      "declared_path": "/admin/blocked-days/{blocked_id}",
      "handler": "delete_blocked_day",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 178,
      "method": "PATCH",
      "declared_path": "/admin/blocked-days/{blocked_id}",
      "handler": "update_blocked_day",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 198,
      "method": "GET",
      "declared_path": "/admin/recurring-contracts",
      "handler": "get_recurring_contracts",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 203,
      "method": "POST",
      "declared_path": "/admin/recurring-contracts",
      "handler": "create_recurring_contract",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 210,
      "method": "PATCH",
      "declared_path": "/admin/recurring-contracts/{contract_id}",
      "handler": "update_recurring_contract",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 227,
      "method": "DELETE",
      "declared_path": "/admin/recurring-contracts/{contract_id}",
      "handler": "delete_recurring_contract",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 234,
      "method": "POST",
      "declared_path": "/admin/recurring-contracts/{contract_id}/generate",
      "handler": "generate_recurring_slots",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 311,
      "method": "GET",
      "declared_path": "/admin/recurring-contracts/check-conflicts",
      "handler": "check_recurring_conflicts",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 357,
      "method": "POST",
      "declared_path": "/admin/recurring-contracts/{contract_id}/cancel-block",
      "handler": "cancel_recurring_block",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/calendar.py",
      "line": 426,
      "method": "DELETE",
      "declared_path": "/admin/recurring-contracts/{contract_id}/cancel-block/{block_id}",
      "handler": "remove_cancellation_block",
      "capability_ids": [
        "CAL01",
        "CAL02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 36,
      "method": "GET",
      "declared_path": "/admin/connector/info",
      "handler": "connector_info",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 47,
      "method": "POST",
      "declared_path": "/admin/connector/regenerate-key",
      "handler": "regenerate_connector_key",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 60,
      "method": "GET",
      "declared_path": "/connector/openapi.json",
      "handler": "connector_openapi",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 97,
      "method": "GET",
      "declared_path": "/connector/summary",
      "handler": "connector_summary",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 103,
      "method": "GET",
      "declared_path": "/connector/pipeline",
      "handler": "connector_pipeline",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 111,
      "method": "GET",
      "declared_path": "/connector/outstanding-invoices",
      "handler": "connector_outstanding",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 125,
      "method": "GET",
      "declared_path": "/connector/open-quotes",
      "handler": "connector_open_quotes",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/connector.py",
      "line": 134,
      "method": "GET",
      "declared_path": "/connector/upcoming-jobs",
      "handler": "connector_upcoming_jobs",
      "capability_ids": [
        "CONNECT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 119,
      "method": "GET",
      "declared_path": "/admin/customer-duplicates",
      "handler": "get_customer_duplicates",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 171,
      "method": "POST",
      "declared_path": "/admin/customer-duplicates/ignore",
      "handler": "ignore_pair",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 289,
      "method": "POST",
      "declared_path": "/admin/customer-duplicates/preview",
      "handler": "preview_merge",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 300,
      "method": "POST",
      "declared_path": "/admin/customer-duplicates/merge",
      "handler": "execute_merge",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 395,
      "method": "GET",
      "declared_path": "/admin/customer-duplicates/merge-history",
      "handler": "merge_history",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 472,
      "method": "POST",
      "declared_path": "/admin/customer-duplicates/rollback-preview",
      "handler": "rollback_preview",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customer_duplicates.py",
      "line": 485,
      "method": "POST",
      "declared_path": "/admin/customer-duplicates/rollback",
      "handler": "execute_rollback",
      "capability_ids": [
        "CUS02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 14,
      "method": "GET",
      "declared_path": "/admin/customers/export",
      "handler": "export_customers",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 43,
      "method": "GET",
      "declared_path": "/admin/customers",
      "handler": "get_customers",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 124,
      "method": "POST",
      "declared_path": "/admin/customers",
      "handler": "create_customer",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 165,
      "method": "POST",
      "declared_path": "/admin/customers/merge",
      "handler": "merge_customers_retired",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 172,
      "method": "POST",
      "declared_path": "/admin/customers/auto-merge-duplicates",
      "handler": "auto_merge_duplicates_retired",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 178,
      "method": "GET",
      "declared_path": "/admin/customers/{customer_id}",
      "handler": "get_customer",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 185,
      "method": "PATCH",
      "declared_path": "/admin/customers/{customer_id}",
      "handler": "update_customer",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 198,
      "method": "POST",
      "declared_path": "/admin/customers/{customer_id}/jobs",
      "handler": "add_job_to_customer",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 262,
      "method": "PUT",
      "declared_path": "/admin/customers/{customer_id}/jobs/{job_index}",
      "handler": "update_job_full",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 305,
      "method": "DELETE",
      "declared_path": "/admin/customers/{customer_id}/jobs/{job_id}",
      "handler": "delete_job",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 342,
      "method": "PATCH",
      "declared_path": "/admin/customers/{customer_id}/jobs/{job_id}",
      "handler": "update_job_by_id",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 393,
      "method": "DELETE",
      "declared_path": "/admin/customers/{customer_id}",
      "handler": "delete_customer",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/customers.py",
      "line": 402,
      "method": "POST",
      "declared_path": "/admin/customers/backfill-from-invoices",
      "handler": "backfill_customers_from_invoices",
      "capability_ids": [
        "CUS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 108,
      "method": "POST",
      "declared_path": "/enquiries",
      "handler": "create_enquiry",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 143,
      "method": "GET",
      "declared_path": "/admin/enquiries",
      "handler": "get_enquiries",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 158,
      "method": "POST",
      "declared_path": "/admin/enquiries",
      "handler": "create_manual_enquiry",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 172,
      "method": "GET",
      "declared_path": "/admin/enquiries/{enquiry_id}",
      "handler": "get_enquiry",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 179,
      "method": "PATCH",
      "declared_path": "/admin/enquiries/{enquiry_id}",
      "handler": "update_enquiry",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 227,
      "method": "DELETE",
      "declared_path": "/admin/enquiries/{enquiry_id}",
      "handler": "delete_enquiry",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 234,
      "method": "POST",
      "declared_path": "/admin/enquiries/{enquiry_id}/convert",
      "handler": "convert_enquiry_to_customer",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 306,
      "method": "GET",
      "declared_path": "/admin/pipeline/stages",
      "handler": "get_pipeline_stages",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 312,
      "method": "PATCH",
      "declared_path": "/admin/enquiries/{enquiry_id}/stage",
      "handler": "update_enquiry_stage",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 419,
      "method": "POST",
      "declared_path": "/admin/enquiries/{enquiry_id}/notify",
      "handler": "send_enquiry_notification",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 544,
      "method": "POST",
      "declared_path": "/admin/jobs/backfill-completion-dates",
      "handler": "backfill_job_completion_dates",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 680,
      "method": "POST",
      "declared_path": "/admin/maintenance/cleanup-test-fixtures",
      "handler": "cleanup_test_fixtures",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 761,
      "method": "POST",
      "declared_path": "/admin/analytics/funnel-backfill",
      "handler": "funnel_backfill",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 907,
      "method": "POST",
      "declared_path": "/admin/jobs/bulk-suppress-review",
      "handler": "bulk_suppress_review",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/enquiries.py",
      "line": 936,
      "method": "POST",
      "declared_path": "/admin/jobs/suppress-pre-cutoff-reviews",
      "handler": "suppress_pre_cutoff_reviews",
      "capability_ids": [
        "JOB01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 12,
      "method": "POST",
      "declared_path": "/feedback",
      "handler": "submit_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 22,
      "method": "GET",
      "declared_path": "/feedback/featured",
      "handler": "get_featured_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 27,
      "method": "GET",
      "declared_path": "/feedback/approved",
      "handler": "get_approved_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 38,
      "method": "GET",
      "declared_path": "/reviews",
      "handler": "get_public_reviews",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 47,
      "method": "GET",
      "declared_path": "/admin/feedback",
      "handler": "get_all_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 78,
      "method": "PATCH",
      "declared_path": "/admin/feedback/{feedback_id}",
      "handler": "update_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 90,
      "method": "PUT",
      "declared_path": "/admin/feedback/{feedback_id}",
      "handler": "edit_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 115,
      "method": "DELETE",
      "declared_path": "/admin/feedback/{feedback_id}",
      "handler": "delete_feedback",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 122,
      "method": "POST",
      "declared_path": "/admin/feedback/manual",
      "handler": "create_manual_review",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 159,
      "method": "POST",
      "declared_path": "/admin/feedback/request-review",
      "handler": "request_review_for_job",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/feedback.py",
      "line": 195,
      "method": "POST",
      "declared_path": "/admin/feedback/link-to-job",
      "handler": "link_feedback_to_job",
      "capability_ids": [
        "WEB04"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/files.py",
      "line": 14,
      "method": "POST",
      "declared_path": "/files/upload",
      "handler": "upload",
      "capability_ids": [
        "PHOTO01",
        "STORAGE01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/files.py",
      "line": 52,
      "method": "POST",
      "declared_path": "/files/upload-public",
      "handler": "upload_public",
      "capability_ids": [
        "PHOTO01",
        "STORAGE01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/files.py",
      "line": 82,
      "method": "GET",
      "declared_path": "/files/{path:path}",
      "handler": "serve_file",
      "capability_ids": [
        "PHOTO01",
        "STORAGE01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 25,
      "method": "GET",
      "declared_path": "/admin/gilberts/rates",
      "handler": "get_gilberts_rates",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 30,
      "method": "GET",
      "declared_path": "/admin/gilberts/shifts",
      "handler": "get_gilberts_shifts",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 53,
      "method": "POST",
      "declared_path": "/admin/gilberts/shifts",
      "handler": "log_gilberts_shift",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 91,
      "method": "DELETE",
      "declared_path": "/admin/gilberts/shifts/{shift_id}",
      "handler": "delete_gilberts_shift",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 102,
      "method": "GET",
      "declared_path": "/admin/gilberts/week-summary",
      "handler": "get_gilberts_week_summary",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 151,
      "method": "POST",
      "declared_path": "/admin/gilberts/generate-invoice",
      "handler": "generate_gilberts_invoice",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/gilberts.py",
      "line": 257,
      "method": "GET",
      "declared_path": "/admin/gilberts/schedule",
      "handler": "get_gilberts_schedule",
      "capability_ids": [
        "GILBERTS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 148,
      "method": "POST",
      "declared_path": "/admin/invoices/bulk-upload",
      "handler": "bulk_upload_invoices",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 211,
      "method": "GET",
      "declared_path": "/admin/invoice-drafts",
      "handler": "list_invoice_drafts",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 223,
      "method": "PATCH",
      "declared_path": "/admin/invoice-drafts/{draft_id}",
      "handler": "update_invoice_draft",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 245,
      "method": "DELETE",
      "declared_path": "/admin/invoice-drafts/{draft_id}",
      "handler": "delete_invoice_draft",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 253,
      "method": "POST",
      "declared_path": "/admin/invoice-drafts/{draft_id}/approve",
      "handler": "approve_invoice_draft",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/invoice_ocr.py",
      "line": 405,
      "method": "POST",
      "declared_path": "/admin/invoice-ocr/backfill-paid",
      "handler": "backfill_ocr_invoices_paid",
      "capability_ids": [
        "DOC08"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/maintenance.py",
      "line": 60,
      "method": "GET",
      "declared_path": "/admin/maintenance/orphaned-uploads",
      "handler": "scan_orphaned_uploads",
      "capability_ids": [
        "STORAGE01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/maintenance.py",
      "line": 70,
      "method": "POST",
      "declared_path": "/admin/maintenance/cleanup-uploads",
      "handler": "cleanup_orphaned_uploads",
      "capability_ids": [
        "STORAGE01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/material_extraction.py",
      "line": 221,
      "method": "POST",
      "declared_path": "/admin/materials/extract-from-invoices",
      "handler": "extract_materials_from_invoices",
      "capability_ids": [
        "DOC08",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/material_extraction.py",
      "line": 330,
      "method": "POST",
      "declared_path": "/admin/materials/extract-from-invoices/confirm",
      "handler": "confirm_extracted_materials",
      "capability_ids": [
        "DOC08",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/material_extraction.py",
      "line": 403,
      "method": "POST",
      "declared_path": "/admin/materials/extract-from-invoices/rollback",
      "handler": "rollback_extracted_materials",
      "capability_ids": [
        "DOC08",
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 21,
      "method": "GET",
      "declared_path": "/admin/materials",
      "handler": "list_materials",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 39,
      "method": "POST",
      "declared_path": "/admin/materials",
      "handler": "create_material",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 61,
      "method": "PATCH",
      "declared_path": "/admin/materials/{material_id}",
      "handler": "update_material",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 88,
      "method": "DELETE",
      "declared_path": "/admin/materials/{material_id}",
      "handler": "delete_material",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 96,
      "method": "GET",
      "declared_path": "/admin/materials/summary",
      "handler": "materials_summary",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 134,
      "method": "GET",
      "declared_path": "/admin/materials/history-match",
      "handler": "history_match",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 161,
      "method": "POST",
      "declared_path": "/admin/materials/import-csv",
      "handler": "import_csv_materials",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 210,
      "method": "POST",
      "declared_path": "/admin/materials/bulk-status",
      "handler": "bulk_update_status",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials.py",
      "line": 250,
      "method": "POST",
      "declared_path": "/admin/materials/supplier-pdf",
      "handler": "export_supplier_pdf",
      "capability_ids": [
        "MAT01",
        "MAT03"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 179,
      "method": "GET",
      "declared_path": "/admin/materials-catalogue",
      "handler": "list_catalogue",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 203,
      "method": "POST",
      "declared_path": "/admin/materials-catalogue",
      "handler": "create_catalogue_item",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 255,
      "method": "PATCH",
      "declared_path": "/admin/materials-catalogue/{item_id}",
      "handler": "update_catalogue_item",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 318,
      "method": "POST",
      "declared_path": "/admin/materials-catalogue/{item_id}/archive",
      "handler": "archive_catalogue_item",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 341,
      "method": "POST",
      "declared_path": "/admin/materials-catalogue/{item_id}/restore",
      "handler": "restore_catalogue_item",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 376,
      "method": "GET",
      "declared_path": "/admin/materials-catalogue/{item_id}/audit",
      "handler": "get_catalogue_audit",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/materials_catalogue.py",
      "line": 384,
      "method": "POST",
      "declared_path": "/admin/materials-catalogue/{item_id}/add-to-job",
      "handler": "add_catalogue_item_to_job",
      "capability_ids": [
        "MAT02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/metrics.py",
      "line": 11,
      "method": "GET",
      "declared_path": "/admin/metrics/summary",
      "handler": "metrics_summary",
      "capability_ids": [
        "REPORT01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 86,
      "method": "GET",
      "declared_path": "/admin/opportunities",
      "handler": "get_opportunities",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 333,
      "method": "GET",
      "declared_path": "/admin/opportunities/repeat-customers",
      "handler": "get_repeat_customer_opportunities",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 340,
      "method": "GET",
      "declared_path": "/admin/opportunities/quote-followups",
      "handler": "get_quote_followup_opportunities",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 347,
      "method": "GET",
      "declared_path": "/admin/opportunities/reviews",
      "handler": "get_review_opportunities",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 354,
      "method": "GET",
      "declared_path": "/admin/opportunities/nearby",
      "handler": "get_nearby_opportunities",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 363,
      "method": "GET",
      "declared_path": "/admin/analytics/revenue-by-service",
      "handler": "get_revenue_by_service",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 439,
      "method": "GET",
      "declared_path": "/admin/analytics/average-job-value",
      "handler": "get_average_job_value",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 458,
      "method": "GET",
      "declared_path": "/admin/analytics/customer-lifetime-value",
      "handler": "get_customer_lifetime_values",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/opportunities.py",
      "line": 521,
      "method": "GET",
      "declared_path": "/admin/customers/{customer_id}/lifetime-value",
      "handler": "get_single_customer_ltv",
      "capability_ids": [
        "GROWTH01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/payment_schedule.py",
      "line": 347,
      "method": "POST",
      "declared_path": "/admin/invoices/{invoice_id}/schedule",
      "handler": "set_payment_schedule",
      "capability_ids": [
        "DOC04",
        "DOC05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/payment_schedule.py",
      "line": 394,
      "method": "POST",
      "declared_path": "/admin/invoices/{invoice_id}/schedule/{stage_id}/request",
      "handler": "request_stage_payment",
      "capability_ids": [
        "DOC04",
        "DOC05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/payment_schedule.py",
      "line": 429,
      "method": "POST",
      "declared_path": "/admin/invoices/{invoice_id}/schedule/{stage_id}/mark-paid",
      "handler": "mark_stage_paid",
      "capability_ids": [
        "DOC04",
        "DOC05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/payment_schedule.py",
      "line": 488,
      "method": "GET",
      "declared_path": "/invoices/{invoice_id}/payment-request/{stage_id}/pdf",
      "handler": "get_payment_request_pdf",
      "capability_ids": [
        "DOC04",
        "DOC05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 161,
      "method": "POST",
      "declared_path": "/login",
      "handler": "customer_login",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 184,
      "method": "POST",
      "declared_path": "/logout",
      "handler": "customer_logout",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 190,
      "method": "GET",
      "declared_path": "/verify-token/{token}",
      "handler": "verify_setup_token",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 203,
      "method": "POST",
      "declared_path": "/set-password",
      "handler": "set_customer_password",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 228,
      "method": "GET",
      "declared_path": "/me",
      "handler": "get_customer_profile",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 239,
      "method": "GET",
      "declared_path": "/quotes",
      "handler": "get_customer_quotes",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 265,
      "method": "GET",
      "declared_path": "/invoices",
      "handler": "get_customer_invoices",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 290,
      "method": "GET",
      "declared_path": "/dashboard",
      "handler": "get_customer_dashboard",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 327,
      "method": "POST",
      "declared_path": "/admin/send-invite/{customer_id}",
      "handler": "admin_send_portal_invite",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 370,
      "method": "POST",
      "declared_path": "/admin/disable-access/{customer_id}",
      "handler": "admin_disable_portal_access",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portal.py",
      "line": 388,
      "method": "GET",
      "declared_path": "/admin/portal-customers",
      "handler": "admin_get_portal_customers",
      "capability_ids": [
        "DOC02",
        "PORTAL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 52,
      "method": "POST",
      "declared_path": "/upload",
      "handler": "upload_file",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 57,
      "method": "POST",
      "declared_path": "/upload-public",
      "handler": "upload_file_public",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 62,
      "method": "GET",
      "declared_path": "/uploads/{filename}",
      "handler": "get_uploaded_file",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 69,
      "method": "GET",
      "declared_path": "/portfolio",
      "handler": "get_portfolio_photos",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 115,
      "method": "GET",
      "declared_path": "/admin/portfolio",
      "handler": "get_admin_portfolio",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 141,
      "method": "GET",
      "declared_path": "/admin/portfolio-photos",
      "handler": "get_standalone_portfolio_photos",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 146,
      "method": "POST",
      "declared_path": "/admin/portfolio-photos",
      "handler": "add_standalone_portfolio_photo",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 161,
      "method": "PATCH",
      "declared_path": "/admin/portfolio-photos/{photo_id}",
      "handler": "update_standalone_portfolio_photo",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 173,
      "method": "DELETE",
      "declared_path": "/admin/portfolio-photos/{photo_id}",
      "handler": "delete_standalone_portfolio_photo",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 181,
      "method": "POST",
      "declared_path": "/admin/portfolio-photos/from-job",
      "handler": "add_job_photos_to_portfolio",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 237,
      "method": "GET",
      "declared_path": "/admin/jobs/{job_id}/photos",
      "handler": "get_job_photos",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/portfolio.py",
      "line": 262,
      "method": "GET",
      "declared_path": "/services",
      "handler": "get_services",
      "capability_ids": [
        "WEB03",
        "PHOTO01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/project.py",
      "line": 56,
      "method": "GET",
      "declared_path": "/admin/jobs/{job_id}/related",
      "handler": "job_related",
      "capability_ids": [
        "CUS01",
        "DOC09",
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/project.py",
      "line": 91,
      "method": "GET",
      "declared_path": "/admin/customers/{customer_id}/timeline",
      "handler": "customer_timeline",
      "capability_ids": [
        "CUS01",
        "DOC09",
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/project.py",
      "line": 187,
      "method": "POST",
      "declared_path": "/admin/jobs/{job_id}/generate-invoice",
      "handler": "generate_invoice_from_job",
      "capability_ids": [
        "CUS01",
        "DOC09",
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/project.py",
      "line": 267,
      "method": "GET",
      "declared_path": "/admin/jobs/{job_id}/profitability",
      "handler": "job_profitability",
      "capability_ids": [
        "CUS01",
        "DOC09",
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/project.py",
      "line": 276,
      "method": "GET",
      "declared_path": "/admin/jobs/{job_id}/suggested-invoice-lines",
      "handler": "suggested_invoice_lines",
      "capability_ids": [
        "CUS01",
        "DOC09",
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/push_notifications.py",
      "line": 20,
      "method": "GET",
      "declared_path": "/push/vapid-key",
      "handler": "get_vapid_key",
      "capability_ids": [
        "PWA01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/push_notifications.py",
      "line": 28,
      "method": "POST",
      "declared_path": "/push/subscribe",
      "handler": "subscribe_push",
      "capability_ids": [
        "PWA01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/push_notifications.py",
      "line": 49,
      "method": "DELETE",
      "declared_path": "/push/unsubscribe",
      "handler": "unsubscribe_push",
      "capability_ids": [
        "PWA01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/seo.py",
      "line": 67,
      "method": "GET",
      "declared_path": "/sitemap.xml",
      "handler": "dynamic_sitemap",
      "capability_ids": [
        "WEB05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/seo.py",
      "line": 163,
      "method": "GET",
      "declared_path": "/robots.txt",
      "handler": "dynamic_robots",
      "capability_ids": [
        "WEB05"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/settings.py",
      "line": 85,
      "method": "GET",
      "declared_path": "/public/business-info",
      "handler": "get_public_business_info",
      "capability_ids": [
        "GOOGLE01",
        "SETTINGS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/settings.py",
      "line": 94,
      "method": "GET",
      "declared_path": "/admin/settings",
      "handler": "get_settings",
      "capability_ids": [
        "GOOGLE01",
        "SETTINGS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/settings.py",
      "line": 100,
      "method": "PUT",
      "declared_path": "/admin/settings",
      "handler": "update_settings",
      "capability_ids": [
        "GOOGLE01",
        "SETTINGS01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 140,
      "method": "GET",
      "declared_path": "/site/content",
      "handler": "get_public_site_content",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 160,
      "method": "GET",
      "declared_path": "/admin/site/content",
      "handler": "get_admin_site_content",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 166,
      "method": "PUT",
      "declared_path": "/admin/site/content",
      "handler": "update_site_content",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 193,
      "method": "GET",
      "declared_path": "/gallery",
      "handler": "get_public_gallery",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 202,
      "method": "GET",
      "declared_path": "/gallery/slug/{slug}",
      "handler": "get_public_gallery_item_by_slug",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 225,
      "method": "GET",
      "declared_path": "/admin/gallery",
      "handler": "get_admin_gallery",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 238,
      "method": "POST",
      "declared_path": "/admin/gallery",
      "handler": "create_gallery_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 264,
      "method": "PATCH",
      "declared_path": "/admin/gallery/{item_id}",
      "handler": "update_gallery_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 291,
      "method": "DELETE",
      "declared_path": "/admin/gallery/{item_id}",
      "handler": "delete_gallery_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 302,
      "method": "POST",
      "declared_path": "/admin/jobs/{job_id}/publish-to-gallery",
      "handler": "publish_job_to_gallery",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 399,
      "method": "POST",
      "declared_path": "/admin/gallery/bulk-move-photos",
      "handler": "bulk_move_photos",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 509,
      "method": "GET",
      "declared_path": "/site/services",
      "handler": "get_public_services",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 519,
      "method": "GET",
      "declared_path": "/site/services/slug/{slug}",
      "handler": "get_public_service_by_slug",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 542,
      "method": "GET",
      "declared_path": "/admin/site/services",
      "handler": "get_admin_services",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 549,
      "method": "POST",
      "declared_path": "/admin/site/services",
      "handler": "create_service_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 576,
      "method": "PATCH",
      "declared_path": "/admin/site/services/{item_id}",
      "handler": "update_service_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_editor.py",
      "line": 595,
      "method": "DELETE",
      "declared_path": "/admin/site/services/{item_id}",
      "handler": "delete_service_item",
      "capability_ids": [
        "WEB02"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 96,
      "method": "GET",
      "declared_path": "/site-mode/active-jobs",
      "handler": "get_active_jobs",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 130,
      "method": "GET",
      "declared_path": "/site-mode/diagnostics",
      "handler": "site_mode_diagnostics",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 183,
      "method": "GET",
      "declared_path": "/site-mode/job/{enquiry_id}/logs",
      "handler": "get_site_logs",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 207,
      "method": "POST",
      "declared_path": "/site-mode/log",
      "handler": "create_site_log",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 230,
      "method": "POST",
      "declared_path": "/site-mode/timer",
      "handler": "manage_timer",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 297,
      "method": "GET",
      "declared_path": "/site-mode/timer/{enquiry_id}",
      "handler": "get_active_timer",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 311,
      "method": "POST",
      "declared_path": "/site-mode/photo",
      "handler": "upload_site_photo",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 405,
      "method": "POST",
      "declared_path": "/site-mode/team-size",
      "handler": "set_team_size",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 418,
      "method": "GET",
      "declared_path": "/site-mode/job/{enquiry_id}/invoice-preview",
      "handler": "preview_invoice_from_logs",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/site_mode.py",
      "line": 481,
      "method": "POST",
      "declared_path": "/site-mode/generate-invoice",
      "handler": "generate_invoice_from_logs",
      "capability_ids": [
        "DOC09",
        "FIELD01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 84,
      "method": "GET",
      "declared_path": "/admin/tax/summary",
      "handler": "tax_summary",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 105,
      "method": "GET",
      "declared_path": "/admin/tax/summary.csv",
      "handler": "tax_summary_csv",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 130,
      "method": "GET",
      "declared_path": "/admin/tax/summary.pdf",
      "handler": "tax_summary_pdf",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 213,
      "method": "GET",
      "declared_path": "/admin/settings/accountant",
      "handler": "get_accountant_settings",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 224,
      "method": "PUT",
      "declared_path": "/admin/settings/accountant",
      "handler": "save_accountant_settings",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/tax.py",
      "line": 247,
      "method": "POST",
      "declared_path": "/admin/tax/send-to-accountant",
      "handler": "send_to_accountant",
      "capability_ids": [
        "TAX01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/time_entries.py",
      "line": 97,
      "method": "GET",
      "declared_path": "/site-mode/job/{enquiry_id}/time-entries",
      "handler": "list_time_entries",
      "capability_ids": [
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/time_entries.py",
      "line": 112,
      "method": "POST",
      "declared_path": "/site-mode/time-entries",
      "handler": "create_time_entry",
      "capability_ids": [
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/time_entries.py",
      "line": 138,
      "method": "PATCH",
      "declared_path": "/site-mode/time-entries/{entry_id}",
      "handler": "update_time_entry",
      "capability_ids": [
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/routers/time_entries.py",
      "line": 168,
      "method": "DELETE",
      "declared_path": "/site-mode/time-entries/{entry_id}",
      "handler": "delete_time_entry",
      "capability_ids": [
        "TIME01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 87,
      "method": "GET",
      "declared_path": "/",
      "handler": "root",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 372,
      "method": "POST",
      "declared_path": "/admin/notifications/test",
      "handler": "test_notification",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 408,
      "method": "GET",
      "declared_path": "/app/version",
      "handler": "app_version",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 442,
      "method": "GET",
      "declared_path": "/admin/dashboard",
      "handler": "get_dashboard_stats",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 478,
      "method": "GET",
      "declared_path": "/auth/google/login",
      "handler": "google_login",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 501,
      "method": "GET",
      "declared_path": "/auth/google/callback",
      "handler": "google_callback",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 556,
      "method": "GET",
      "declared_path": "/admin/google/status",
      "handler": "google_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 569,
      "method": "GET",
      "declared_path": "/admin/google/team-status",
      "handler": "google_team_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 582,
      "method": "POST",
      "declared_path": "/admin/google/disconnect",
      "handler": "google_disconnect",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 590,
      "method": "POST",
      "declared_path": "/admin/google/disconnect/{admin_id}",
      "handler": "google_disconnect_admin",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 603,
      "method": "GET",
      "declared_path": "/admin/google/calendars",
      "handler": "list_google_calendars",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 624,
      "method": "POST",
      "declared_path": "/admin/google/sync-booking",
      "handler": "sync_booking_to_google",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 668,
      "method": "POST",
      "declared_path": "/admin/google/sync-all",
      "handler": "sync_all_bookings_to_google",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 772,
      "method": "DELETE",
      "declared_path": "/admin/google/event/{booking_id}",
      "handler": "remove_google_event",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 807,
      "method": "GET",
      "declared_path": "/admin/drive/status",
      "handler": "drive_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 822,
      "method": "POST",
      "declared_path": "/admin/drive/upload",
      "handler": "upload_to_drive",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 880,
      "method": "GET",
      "declared_path": "/drive-proxy/{file_id}",
      "handler": "drive_proxy",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 920,
      "method": "POST",
      "declared_path": "/upload-public-drive",
      "handler": "upload_public_drive",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 974,
      "method": "GET",
      "declared_path": "/admin/drive/folders",
      "handler": "list_drive_folders",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 999,
      "method": "GET",
      "declared_path": "/admin/drive/files/{folder_type}",
      "handler": "list_drive_files",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1082,
      "method": "POST",
      "declared_path": "/admin/invoices",
      "handler": "create_invoice",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1558,
      "method": "GET",
      "declared_path": "/admin/invoices",
      "handler": "list_invoices",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1591,
      "method": "GET",
      "declared_path": "/admin/invoices/next-reference",
      "handler": "next_invoice_reference",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1604,
      "method": "POST",
      "declared_path": "/admin/invoices/historical-rename",
      "handler": "historical_rename_invoices",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1674,
      "method": "GET",
      "declared_path": "/admin/invoices/{invoice_id}",
      "handler": "get_invoice",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1682,
      "method": "GET",
      "declared_path": "/invoices/{invoice_id}/pdf",
      "handler": "get_invoice_pdf",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1710,
      "method": "GET",
      "declared_path": "/invoices/{invoice_id}",
      "handler": "get_invoice_pdf_redirect",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1715,
      "method": "DELETE",
      "declared_path": "/admin/invoices/{invoice_id}",
      "handler": "delete_invoice",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1724,
      "method": "PUT",
      "declared_path": "/admin/invoices/{invoice_id}",
      "handler": "update_invoice",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 1945,
      "method": "PATCH",
      "declared_path": "/admin/invoices/{invoice_id}",
      "handler": "update_invoice_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2016,
      "method": "POST",
      "declared_path": "/admin/invoices/{invoice_id}/payments",
      "handler": "record_invoice_payment",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2105,
      "method": "PATCH",
      "declared_path": "/admin/invoices/{invoice_id}/payments/{payment_id}",
      "handler": "update_invoice_payment",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2151,
      "method": "DELETE",
      "declared_path": "/admin/invoices/{invoice_id}/payments/{payment_id}",
      "handler": "delete_invoice_payment",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2236,
      "method": "POST",
      "declared_path": "/admin/invoices/{invoice_id}/regenerate-pdf",
      "handler": "regenerate_invoice_pdf",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2484,
      "method": "POST",
      "declared_path": "/admin/quotes",
      "handler": "create_quote",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2839,
      "method": "GET",
      "declared_path": "/admin/quotes",
      "handler": "list_quotes",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2845,
      "method": "GET",
      "declared_path": "/admin/quotes/{quote_id}",
      "handler": "get_quote",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2853,
      "method": "PATCH",
      "declared_path": "/admin/quotes/{quote_id}/status",
      "handler": "update_quote_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 2893,
      "method": "POST",
      "declared_path": "/admin/quotes/{quote_id}/regenerate-pdf",
      "handler": "regenerate_quote_pdf",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3167,
      "method": "GET",
      "declared_path": "/quotes/{quote_id}/pdf",
      "handler": "get_quote_pdf",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3206,
      "method": "GET",
      "declared_path": "/quotes/{quote_id}",
      "handler": "get_quote_pdf_redirect",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3211,
      "method": "POST",
      "declared_path": "/admin/quotes/{quote_id}/convert-to-invoice",
      "handler": "convert_quote_to_invoice",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3235,
      "method": "POST",
      "declared_path": "/admin/quotes/{quote_id}/convert-to-job",
      "handler": "convert_quote_to_job",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3303,
      "method": "PUT",
      "declared_path": "/admin/quotes/{quote_id}",
      "handler": "update_quote",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3420,
      "method": "DELETE",
      "declared_path": "/admin/quotes/{quote_id}",
      "handler": "delete_quote",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3460,
      "method": "POST",
      "declared_path": "/admin/ai/quote-estimation",
      "handler": "ai_quote_estimation",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3539,
      "method": "POST",
      "declared_path": "/admin/ai/job-description",
      "handler": "ai_job_description",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3579,
      "method": "POST",
      "declared_path": "/admin/ai/auto-reply",
      "handler": "ai_auto_reply",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3634,
      "method": "POST",
      "declared_path": "/admin/ai/review-request",
      "handler": "ai_review_request",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3683,
      "method": "POST",
      "declared_path": "/admin/ai/re-engagement-message",
      "handler": "ai_re_engagement_message",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3738,
      "method": "POST",
      "declared_path": "/admin/ai/quote-followup-message",
      "handler": "ai_quote_followup_message",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3787,
      "method": "POST",
      "declared_path": "/admin/ai/nearby-notification",
      "handler": "ai_nearby_notification",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3836,
      "method": "POST",
      "declared_path": "/admin/ai/seasonal-message",
      "handler": "ai_seasonal_message",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3888,
      "method": "GET",
      "declared_path": "/admin/analytics/tags",
      "handler": "get_tag_analytics",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 3925,
      "method": "GET",
      "declared_path": "/admin/ai/business-insights",
      "handler": "ai_business_insights",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4101,
      "method": "GET",
      "declared_path": "/admin/ai/follow-up-suggestions",
      "handler": "ai_follow_up_suggestions",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4192,
      "method": "GET",
      "declared_path": "/admin/ai/schedulable-jobs",
      "handler": "get_schedulable_jobs",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4296,
      "method": "POST",
      "declared_path": "/admin/ai/smart-scheduling",
      "handler": "ai_smart_scheduling",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4360,
      "method": "GET",
      "declared_path": "/admin/ai/strategic-insights",
      "handler": "ai_strategic_insights",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4532,
      "method": "POST",
      "declared_path": "/admin/ai/customer-outreach",
      "handler": "ai_customer_outreach",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4619,
      "method": "GET",
      "declared_path": "/admin/ai/service-recommendations",
      "handler": "ai_service_recommendations",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4733,
      "method": "GET",
      "declared_path": "/admin/reports/weekly-summary",
      "handler": "get_weekly_summary",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4823,
      "method": "POST",
      "declared_path": "/admin/reports/send-weekly-email",
      "handler": "send_weekly_report_email",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 4972,
      "method": "GET",
      "declared_path": "/admin/ai/business-intelligence",
      "handler": "get_ai_business_intelligence",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 5483,
      "method": "POST",
      "declared_path": "/admin/ai/draft-email",
      "handler": "ai_draft_email",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 5577,
      "method": "GET",
      "declared_path": "/admin/ai/alerts",
      "handler": "get_ai_alerts",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 5930,
      "method": "GET",
      "declared_path": "/admin/reports/scheduler-status",
      "handler": "get_scheduler_status",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    },
    {
      "file": "backend/server.py",
      "line": 5945,
      "method": "POST",
      "declared_path": "/admin/reports/test-scheduled-email",
      "handler": "test_scheduled_email",
      "capability_ids": [
        "DOC01",
        "DOC02",
        "DOC03",
        "DOC04",
        "DOC06",
        "DOC07",
        "AI01",
        "GOOGLE01",
        "EMAIL01"
      ],
      "source_status": "source-evidenced",
      "parity_status": "Needs individual workflow comparison; capability-level progress is not route approval",
      "implementation_claim": null
    }
  ],
  "frontend_routes": [
    {
      "file": "frontend/src/App.js",
      "line": 93,
      "path": "/",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 94,
      "path": "/enquiry",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 95,
      "path": "/about",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 96,
      "path": "/services/:slug",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 97,
      "path": "/feedback",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 98,
      "path": "/reviews",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 99,
      "path": "/portal",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 100,
      "path": "/portal/setup",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 101,
      "path": "/admin",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 102,
      "path": "/admin/dashboard",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 105,
      "path": "/admin/:section/*",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 107,
      "path": "/gallery",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 108,
      "path": "/gallery/:slug",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 110,
      "path": "/privacy",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 111,
      "path": "/terms",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 112,
      "path": "/cookies",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/App.js",
      "line": 115,
      "path": "*",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/lib/__tests__/publicSeo.test.jsx",
      "line": 178,
      "path": "/services/:slug",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    },
    {
      "file": "frontend/src/lib/__tests__/publicSeo.test.jsx",
      "line": 195,
      "path": "/services/:slug",
      "source_status": "source-evidenced",
      "ui_verified": "not verified against live SHS"
    }
  ],
  "nested_ui_actions": [
    {
      "file": "frontend/plugins/visual-edits/babel-metadata-plugin.js",
      "line": 111,
      "action": "importMap",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/plugins/visual-edits/babel-metadata-plugin.js",
      "line": 285,
      "action": "exportName",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/plugins/visual-edits/babel-metadata-plugin.js",
      "line": 735,
      "action": "exportName",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/CookieConsent.jsx",
      "line": 55,
      "action": "handleAcceptAll",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/CookieConsent.jsx",
      "line": 66,
      "action": "handleAcceptEssential",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/CookieConsent.jsx",
      "line": 77,
      "action": "handleSavePreferences",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 76,
      "action": "handleAiQuoteEstimate",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 98,
      "action": "handleAiJobDescription",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 120,
      "action": "handleAiAutoReply",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 142,
      "action": "handleAiBusinessInsights",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 160,
      "action": "handleAiFollowUps",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 178,
      "action": "handleAiStrategicInsights",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 196,
      "action": "handleAiOutreach",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 226,
      "action": "handleAiServiceRecs",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 257,
      "action": "sendWeeklyEmail",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIAssistantTab.jsx",
      "line": 273,
      "action": "handleCreateQuoteFromEstimate",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIInsightsPanel.jsx",
      "line": 92,
      "action": "handleDraftEmail",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AIInsightsPanel.jsx",
      "line": 115,
      "action": "handleCreateTask",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/AnalyticsTab.jsx",
      "line": 227,
      "action": "openDrillDown",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/CataloguePicker.jsx",
      "line": 59,
      "action": "handleAdd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/CustomersTab.jsx",
      "line": 111,
      "action": "handleBackfillFromInvoices",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
      "line": 25,
      "action": "handleScan",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
      "line": 53,
      "action": "updateSupplier",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
      "line": 67,
      "action": "handleConfirm",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ExtractMaterialsDialog.jsx",
      "line": 86,
      "action": "handleRollback",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/FeedbackTab.jsx",
      "line": 91,
      "action": "deleteFeedback",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/FeedbackTab.jsx",
      "line": 103,
      "action": "handleCreateReview",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/FeedbackTab.jsx",
      "line": 140,
      "action": "handleAddReviewClick",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/FeedbackTab.jsx",
      "line": 144,
      "action": "handleEditReviewClick",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/FeedbackTab.jsx",
      "line": 161,
      "action": "handleSaveEdit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 112,
      "action": "handleBatchInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 156,
      "action": "handleLogGilbertsShift",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 192,
      "action": "openEditShift",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 208,
      "action": "handleUpdateShift",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 250,
      "action": "handleDeleteShift",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GilbertsTab.jsx",
      "line": 262,
      "action": "handleGenerateGilbertsInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GrowthOpportunitiesPanel.jsx",
      "line": 59,
      "action": "generateMessage",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/GrowthOpportunitiesPanel.jsx",
      "line": 119,
      "action": "openMessageDialog",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ImageUploader.jsx",
      "line": 67,
      "action": "handleFiles",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/InvoiceBulkUpload.jsx",
      "line": 49,
      "action": "handleFiles",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/InvoiceBulkUpload.jsx",
      "line": 95,
      "action": "saveEdits",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobMaterialsPanel.jsx",
      "line": 44,
      "action": "handleAdd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobMaterialsPanel.jsx",
      "line": 67,
      "action": "handleStatus",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobMaterialsPanel.jsx",
      "line": 76,
      "action": "handleDelete",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobTimePanel.jsx",
      "line": 76,
      "action": "openAdd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobTimePanel.jsx",
      "line": 85,
      "action": "openEdit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobsTab.jsx",
      "line": 230,
      "action": "handleSyncCompletionDates",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/JobsTab.jsx",
      "line": 260,
      "action": "handleBulkSuppress",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
      "line": 55,
      "action": "openAdd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
      "line": 57,
      "action": "openEdit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
      "line": 71,
      "action": "handleSave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCataloguePanel.jsx",
      "line": 117,
      "action": "handleConfirm",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCsvImport.jsx",
      "line": 88,
      "action": "handleFile",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsCsvImport.jsx",
      "line": 159,
      "action": "handleImport",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 89,
      "action": "openAdd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 95,
      "action": "openEdit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 111,
      "action": "handleSave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 137,
      "action": "handleDelete",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 148,
      "action": "handleStatusChange",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 257,
      "action": "handleBulkStatus",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/MaterialsTab.jsx",
      "line": 276,
      "action": "handleExportSupplierPdf",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PaymentScheduleEditor.jsx",
      "line": 120,
      "action": "updateStage",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PaymentScheduleEditor.jsx",
      "line": 132,
      "action": "saveSchedule",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PaymentScheduleEditor.jsx",
      "line": 233,
      "action": "deletePayment",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 115,
      "action": "updateEnquiryStage",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 150,
      "action": "updateJobStage",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 167,
      "action": "openEditJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 179,
      "action": "saveJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 208,
      "action": "deleteJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 222,
      "action": "openEditCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 242,
      "action": "saveCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 271,
      "action": "deleteCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 286,
      "action": "openEditEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 302,
      "action": "saveEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 333,
      "action": "deleteEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PipelineTab.jsx",
      "line": 347,
      "action": "sendEnquiryNotification",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PortfolioTab.jsx",
      "line": 124,
      "action": "handlePortfolioFileUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PortfolioTab.jsx",
      "line": 176,
      "action": "handleRemoveFromPortfolio",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
      "line": 80,
      "action": "handleIgnore",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
      "line": 96,
      "action": "openMerge",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
      "line": 118,
      "action": "generatePreview",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/PossibleDuplicatesPanel.jsx",
      "line": 151,
      "action": "openRollback",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/ProjectCommandCenter.jsx",
      "line": 45,
      "action": "handleGenerateInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 217,
      "action": "openPaymentDialog",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 230,
      "action": "handleRecordPayment",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 261,
      "action": "createQuoteData",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 279,
      "action": "createInvoiceData",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 394,
      "action": "handlePullFromJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 429,
      "action": "handleCreateInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 456,
      "action": "openEditInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 469,
      "action": "saveEditedInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 490,
      "action": "handleCreateQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 509,
      "action": "openEditQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 514,
      "action": "saveEditedQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 530,
      "action": "handleRejectQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/QuotesInvoicesTab.jsx",
      "line": 539,
      "action": "handleConvertToJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 50,
      "action": "handleSave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 64,
      "action": "handleSend",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 183,
      "action": "handleSave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 439,
      "action": "handleUpdateProfile",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 454,
      "action": "handleChangePassword",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 479,
      "action": "handleAddAdmin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 496,
      "action": "handleDeleteAdmin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 509,
      "action": "handleSyncAllToGoogle",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SettingsTab.jsx",
      "line": 534,
      "action": "handleTestNotification",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 104,
      "action": "handleBlockChange",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 108,
      "action": "handleSave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 347,
      "action": "openNew",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 356,
      "action": "saveItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 408,
      "action": "deleteItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 814,
      "action": "openNew",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteEditorTab.jsx",
      "line": 870,
      "action": "deleteItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 280,
      "action": "handlePhotoFiles",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 286,
      "action": "handlePhotoUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 337,
      "action": "openInvoicePreview",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 358,
      "action": "updateLineItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 372,
      "action": "generateInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/admin/SiteModeTab.jsx",
      "line": 420,
      "action": "handleManualSync",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/components/ui/carousel.jsx",
      "line": 56,
      "action": "handleKeyDown",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/hooks/useOfflineQueue.js",
      "line": 14,
      "action": "saveQueue",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 497,
      "action": "openJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 498,
      "action": "openInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 533,
      "action": "handleForceReload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 637,
      "action": "handleConnectGoogle",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 646,
      "action": "handleDisconnectGoogle",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 657,
      "action": "handleSyncAllToGoogle",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 708,
      "action": "handleCreateInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 768,
      "action": "updateInvoiceLineItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 778,
      "action": "deleteInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 790,
      "action": "openEditInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 799,
      "action": "saveEditedInvoice",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 853,
      "action": "updateEditInvoiceLineItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 863,
      "action": "createInvoiceFromCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 890,
      "action": "handleCreateQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 942,
      "action": "updateQuoteLineItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 951,
      "action": "handleQuoteFileUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 975,
      "action": "deleteQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 999,
      "action": "updateQuoteStatus",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1010,
      "action": "openEditQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1019,
      "action": "saveEditedQuote",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1058,
      "action": "updateEditQuoteLineItem",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1199,
      "action": "handleRemoveFromPortfolio",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1228,
      "action": "handleAddStandalonePhoto",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1245,
      "action": "handlePortfolioFileUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1284,
      "action": "handleUpdatePortfolioPhoto",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1348,
      "action": "handleUpdateProfile",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1363,
      "action": "openEditBooking",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1371,
      "action": "handleUpdateBooking",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1391,
      "action": "handleChangePassword",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1412,
      "action": "handleDeleteAdmin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1424,
      "action": "handleAddAdmin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1444,
      "action": "handleUpdateAdmin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1464,
      "action": "handleGenerateContractSlots",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1482,
      "action": "handleDeleteContract",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1493,
      "action": "handleToggleContractActive",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1503,
      "action": "openEditContract",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1521,
      "action": "handleSaveContract",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1559,
      "action": "handleCheckAllConflicts",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1574,
      "action": "updateAdminColor",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1600,
      "action": "handleLogout",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1611,
      "action": "handleStatusChange",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1624,
      "action": "handleSaveNotes",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1639,
      "action": "handleDelete",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1651,
      "action": "handleAddEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1685,
      "action": "openEditEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1704,
      "action": "handleSaveEnquiry",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1729,
      "action": "handleQuickFieldUpdate",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1744,
      "action": "handleQuickAction",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1829,
      "action": "handleRequestReview",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1848,
      "action": "handleAddPhotosToPortfolio",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1881,
      "action": "generateAIContent",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1957,
      "action": "handleConvertToCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1969,
      "action": "handleExportCSV",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1988,
      "action": "openDetail",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 1995,
      "action": "handlePublishToGallery",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2046,
      "action": "handleAddCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2062,
      "action": "handleUpdateCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2079,
      "action": "handleSendPortalInvite",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2099,
      "action": "handleDisablePortalAccess",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2110,
      "action": "handleDeleteCustomer",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2122,
      "action": "handleTaxExport",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2150,
      "action": "handleAddJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2167,
      "action": "openJobPhotos",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2181,
      "action": "handleFileUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2234,
      "action": "handleAddPhoto",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2264,
      "action": "handleRemovePhoto",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2285,
      "action": "handleUpdatePhoto",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2309,
      "action": "handleDragStart",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2314,
      "action": "handleDragOver",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2319,
      "action": "handleDrop",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2351,
      "action": "handleToggleFeatured",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2372,
      "action": "handleUpdateJobStatus",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2389,
      "action": "handleDeleteJob",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2403,
      "action": "handleBlockDay",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2492,
      "action": "handleUnblockDay",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2502,
      "action": "openBlockDayDialog",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2527,
      "action": "handleJobDragStart",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2535,
      "action": "handleJobDragEnd",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2541,
      "action": "handleCalendarDragOver",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2550,
      "action": "handleCalendarDragLeave",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2557,
      "action": "handleCalendarDrop",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2580,
      "action": "openCustomerDetail",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2595,
      "action": "generateSlotContent",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminDashboard.jsx",
      "line": 2627,
      "action": "exportWeekSchedule",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminLogin.jsx",
      "line": 83,
      "action": "handleLogin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/AdminLogin.jsx",
      "line": 161,
      "action": "handleResetCache",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/CustomerPortal.jsx",
      "line": 93,
      "action": "handleLogin",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/CustomerPortal.jsx",
      "line": 111,
      "action": "handleLogout",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/EnquiryPage.jsx",
      "line": 90,
      "action": "handleInputChange",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/EnquiryPage.jsx",
      "line": 95,
      "action": "handleServiceChange",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/EnquiryPage.jsx",
      "line": 99,
      "action": "handleFileUpload",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/EnquiryPage.jsx",
      "line": 141,
      "action": "handleSubmit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/FeedbackPage.jsx",
      "line": 45,
      "action": "handleKeyDown",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/FeedbackPage.jsx",
      "line": 145,
      "action": "handleSubmit",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/LandingPage.jsx",
      "line": 278,
      "action": "openLightbox",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/LandingPage.jsx",
      "line": 295,
      "action": "handleServiceClick",
      "status": "source-evidenced; nested action requires tracked parity review"
    },
    {
      "file": "frontend/src/pages/PortalSetup.jsx",
      "line": 49,
      "action": "handleSubmit",
      "status": "source-evidenced; nested action requires tracked parity review"
    }
  ],
  "unmapped_backend_routes": [],
  "v022_axis_policy": {
    "applies_to_all_45": "Existing source_status/source_evidence, implementation_status, automated_test_status, ui_verified_status and remaining_gaps_and_decisions are separate evidence axes. Only FIELD01/PWA01 receive new stage evidence. Other recorded integration status remains unchanged; this stage verifies no live integration.",
    "original_findings": "All 14 original findings remain OPEN against unchanged original/deployment; local improvements do not close them."
  },
  "v023_maintenance_regression": {
    "capability": "WEB01",
    "change": "Continuous supervised image input prevents premature timeout on an existing supported large photo",
    "evidence": "32 format/recovery tests; 743 final full backend tests; no new browser/phone claim",
    "limits": "Existing sizes/formats/resource bounds unchanged; no photo queue added"
  },
  "v024_axis_policy": {
    "changed_capability_objects": [
      "CUS02"
    ],
    "unchanged_capability_objects": 44,
    "original_findings_unchanged": 14,
    "browser_ui_axis_unchanged": true,
    "schema_format": 13,
    "backup_metadata": "0.24.0",
    "guide": "CUSTOMER-MOVE-HISTORY.md",
    "source_map": "customer-move-source-map.json"
  }
}
