# SHS feature comparison — 29 October 2026

Current checkpoint: **v0.20**, public-enquiry HEIC/HEIF still-image support and five files at 10 MiB each / 50 MiB combined, with content validation, supervised local conversion and unchanged private exact-job binding. See [photo-format guide](ENQUIRY-PHOTO-FORMATS.md), [source evidence](enquiry-format-source-map.json) and [checks](enquiry-format-milestone-checks.json). Automated and recovery results are recorded separately from browser proof. The new picker/phone journey remains unverified. The v0.19.1 final bundle passed eleven additional browser workflow groups on 30 October; selected-file retention/Clear/discard and old QA-tab cleanup remain unverified. No unlock, dialog or permission question is pending. All 45 capabilities remain tracked and all 14 original SHS findings remain OPEN. This checkpoint does not approve live use or full parity.

Preserved historical checkpoint: **v0.18**. The [website browser walkthrough](WEBSITE-WORKFLOW-WALKTHROUGH.md) and [checks](website-journey-milestone-checks.json) verify editing, publication/history separation, two isolated public enquiries and four repaired defects. 612 backend tests, 113 client tests, 81 structural render checks and the build pass. The actual UI dataset passed fresh same-Mac CLI/test-API recovery. Format 11, schema and dependencies remain unchanged. Older stage-specific counts below are historical; all 14 original SHS findings remain OPEN.

The existing SHS application remains the reference for the future product. The first local slice is a starting point, not an agreed reduction of scope. The continuing target is one maintained white-label version matching or improving the useful public website, portal and staff/admin PWA journeys. Missing functions stay in scope until explicitly decided otherwise. See [the full parity/gap register](FULL-PARITY-REGISTER.md) and its 275-file/283-route/19-frontend-route/217-action inventory for nested workflows, verification states and trial gates.

**Evidence boundary: source-verified, not live-verified.** This comparison uses the downloaded SHS ZIP only. Current deployed administrative behaviour is unverified. Earlier access checks reached sign-in and Mac capture failed; no live records/settings were changed or copied. No further live access is being attempted, following Sandy's instruction to use the downloaded code. Prototype claims below are local test results, not SHS production approval.

Source file paths below are relative to the preserved SHS export. The complete 13-section navigation registry is frontend/src/lib/adminSections.js:4–17, corroborated by the sidebar and render branches in frontend/src/pages/AdminDashboard.jsx:2804–2954 and 3265–4263.

| SHS area / workflow | Local prototype 0.18 | Scope / evidence |
| --- | --- | --- |
| Jobs: enquiries, pipeline stages, priorities/tags, linked records and next actions | Partial: enquiry capture, stages, dates, notes and linked quotes/invoices only | Generic. AdminDashboard.jsx; components/admin/JobsTab.jsx, PipelineTab.jsx; backend/models.py Enquiry models |
| Site Mode: field workflow, job context, manual time, photos and job materials | Partial: private logs/photos, named one/two-person timers, explicit owner review/conversion and reviewed source drafts implemented; phone/browser/offline parity pending | Generic. components/admin/SiteModeTab.jsx; JobTimePanel.jsx; JobMaterialsPanel.jsx; routers/site_mode.py, time_entries.py |
| Calendar: day/week views, availability/blocked days, assigned team and multi-day jobs | Implemented local manual/recurrence core: day/week/month/bounded range, team/job filters, exact interval conflicts, reversible bookings and reviewed recurring visits. Drag/drop, sync, print/share and new UI checks remain | Generic. components/admin/CalendarSection.jsx; AdminDashboard.jsx calendar section; routers/calendar.py |
| Customers: search, edits, existing-customer linking, job history/timeline, duplicate merge | Implemented manual core: search/create/edit, selected-customer reuse, exact-ID history and guarded bare-enquiry linking; broad duplicate merges/backfills deferred | Generic. CustomersTab.jsx; CustomerTimeline.jsx; PossibleDuplicatesPanel.jsx; routers/customers.py, customer_duplicates.py |
| Quotes & Invoices: edits, customer/job linking, payments, document/email actions and histories | Partial: editable private drafts, sealed quote revisions/acceptance, direct/converted invoice drafts with explicit issue, immutable issued history, cancellation/void/unpaid replacement, exact fractional lines and audited receipt corrections | Generic. QuotesInvoicesTab.jsx; backend/server.py quote/invoice handlers |
| Payment schedules/deposits, scheduled instalments and correction flows | Partial: percentage deposit helper, fixed stages, due dates, local requests and exact receipt allocation; real refunds/credits and post-request replanning remain open | Generic. routers/payment_schedule.py; components/admin/QuotesInvoicesTab.jsx and related dialogs |
| Invoice bulk upload/OCR, bulk date correction and material extraction | Missing; external extraction disabled | Generic capability with SHS historic-data conventions. InvoiceBulkUpload.jsx, InvoiceBulkDates.jsx, ExtractMaterialsDialog.jsx; routers/invoice_ocr.py, material_extraction.py |
| Materials job tracker | Implemented manual core: job links, costs, stages/dates, bulk changes, filters, archive/restore, CSV review/import and job panel; extraction deferred | Generic. MaterialsTab.jsx; JobMaterialsPanel.jsx; routers/materials.py; models.py:595–653 |
| Reusable materials catalogue | Implemented: supplier/SKU/unit/default cost, optional charge reference, version checks, snapshots, archive/restore and history | Generic. MaterialsCataloguePanel.jsx, CataloguePicker.jsx; routers/materials_catalogue.py |
| Supplier reference links, manual last price/date, filters and cost-free order list | Implemented manual references and private printable order view; direct generated PDF and external services deferred | Generic. MaterialsTab.jsx:680–752; routers/materials.py supplier-pdf route |
| Manual time/labour and job profitability | Partial: manual time, rate snapshots, corrections/history, archive/restore and separated job costs implemented; payroll, overheads, VAT basis and accounting profit missing | Generic. JobTimePanel.jsx; InvoiceProfitabilityWidget.jsx; routers/time_entries.py and project.py profitability route |
| Lightbox: job photos, before/after sets, categorisation and gallery publishing | Implemented local core: private job photos, separate customer sharing and reviewed public project collections/comparisons/service galleries/history; browser checks pending | Generic. components/admin/PortfolioTab.jsx and lightbox routes; routers/portfolio.py |
| Feedback: request, ratings, moderation and public review publication | Implemented local core: exact-record captures, private original answers, separate public permission, owner preview/publication, withdrawal/history and safe selected-testimonial projection. Bounded private/public/withdrawal/revocation UI verified in v0.17; wider device/portal/expiry cases and real delivery remain | Generic. components/admin/FeedbackTab.jsx; routers/feedback.py. No invented testimonials should be seeded |
| Analytics: revenue/service/customer/team, quote funnel, tags and shared metrics | Local core: exact service/customer/team reports, nested cohort, overlapping tags/stages, explicit definitions and private CSVs with actual download evidence. Overview current quote semantics are aligned; historical accounting, traffic, forecasts, large data and broader UI remain | Generic. AnalyticsTab.jsx; metrics_service.py; routers/analytics.py, metrics.py |
| AI Assistant and AI writing/insights | Missing; external calls disabled | Generic optional integration, still inventoried. AIAssistantTab.jsx, AIInsightsPanel.jsx; routers/ai_chat.py, ai_writer.py |
| Tax/reporting and historical extraction rules | Missing | Generic reporting with SHS-specific conventions/cut-offs to separate. routers/tax.py; material_extraction.py and analytics source. No tax-compliance claim |
| Gilberts shifts, CNC/maintenance rates and related contract operations | Missing; **SHS-specific** workflow | GilbertsTab.jsx; routers/gilberts.py; AdminDashboard.jsx. Preserve in inventory; decide later whether configurable contracts module or private extension |
| Recurring contracts, generated bookings, holiday exceptions and project workflows | Recurring local core implemented with exact jobs, finite rules, atomic generation, overrides/cancellations and reversible holiday blocks. Specialist project/rate/batch workflows remain | Generic operations. routers/calendar.py recurring-contract routes, project.py; nested customer/job dialogs |
| Storage maintenance: orphan inspection and safe cleanup | Missing beyond owned website images | Generic operations. routers/maintenance.py; StorageCleanupCard.jsx |
| Growth opportunities: repeat customers, quote follow-ups, review requests and nearby work | Local private review core: exact source rules, prepared drafts, snooze/dismiss/complete/reopen and history; optional explicit postcode groups replace approximate distance claims | routers/opportunities.py; GrowthOpportunitiesPanel.jsx. Earlier procurement label corrected from source; live reachability unverified |
| Site Editor: public content/settings, services and publishing | Implemented local core: structured pages/sections, service routes, ordered navigation, private photo visibility and draft/preview/local publish/restore; bounded v0.18 website/enquiry and conflict UI verified | Generic. SiteEditorTab.jsx; routers/site_editor.py. Full page/content parity still needed |
| Settings: business/team/accounts, pricing, storage, Google and other integrations | Partial: published business identity/contact/logo/colours, optional document wording and team resource cost defaults; local owner/staff memberships, invitations/reset capture and setup added; wider pricing/payment settings and integrations missing | Generic settings with SHS defaults. SettingsTab.jsx; routers/settings.py; AdminDashboard.jsx settings callbacks |
| Customer portal | Partial: exact-customer shared quote/invoice view and access revocation | Generic. routers/portal.py; original portal screens versus new limited portal |
| Public website, SEO and service pages | Local core: editable pages/services and two isolated enquiries verified in v0.18; v0.19 adds optional date and five private PNG/JPEG/WebP enquiry photos; broader source parity remains | Generic with SHS copy/assets to replace. App.js public routes, lib/publicSite.js; routers/seo.py |
| Offline/PWA installation, notifications and field replay | Partial v0.21 local static shell, neutral fallback and deliberate update; public browser verified | Original worker/index/queue mapped in PWA guide. Durable queue, field replay, background timers, push, authenticated/device and production installation remain missing. All original findings OPEN. |
| White-label onboarding, subscription billing and verified own domains | Missing / domain mapping simulator only | Required new-product functions; not established by the export. Saved brief and plan remain authoritative |
| Local backup and recovery | Implemented bounded multi-business formats 1–11 snapshot/verify/fresh-folder restore with retained customer/document/receipt/field/source/feedback history and deliberate access revocation. Reports/CSV bytes reproduce after restore; production and second-machine recovery remain open | New independent reliability work. Does not assert an original SHS backup implementation or full operational parity. |

## Materials behaviour to preserve

The source tracker links each row to a job, records name, fractional quantity, unit, unit cost, computed total, supplier, notes and product-reference links. It moves through **To order → Ordered → Received**, stamps dates and offers bulk updates. It searches/filter by status, customer and supplier; hides completed/paid/cancelled job materials by default, with a historical toggle. The job drawer has its own materials list, quick add, totals and catalogue picker.

Catalogue items have supplier, SKU, unit, exact default cost in pence and an optional default charge price. Active names are unique after trimming/case normalisation. Edits/archive/restore use versions and audit history. Adding to a job creates a snapshot; later catalogue edits must not alter the job's material costs. **Default charge price is reference-only and must not feed quotes, invoices, revenue or payment totals.**

The source includes CSV column detection/preview and explicit recent-price suggestions. Supplier order PDFs deliberately exclude unit costs and totals. Invoice extraction can call AI and changes records only after confirmation; it also includes rollback and SHS-specific historical-date rules. Those external/automatic extraction functions will remain disabled in the local implementation.

## Materials update delivered locally

The manual tracker, catalogue snapshots, supplier references, scoped filters, per-job panel, bulk stages, reviewed CSV import and private cost-free order view are implemented. Version 0.1 was preserved with a Git tag and recovery bundle before editing; its original ZIP is retained. Safe SHS money-validation and CSV/money UI helpers were reused/adapted with exact provenance. No original runtime or integration is imported.

At the Materials checkpoint (0.2), **50 backend tests** and three JavaScript CSV tests passed, including the original 18 regressions. Desktop checks verified £12.34 × 2.5 = £30.85, catalogue edits leaving that job cost unchanged, supplier references, CSV preview/import, stages, job-panel entry, persistence after restart, a cost-free supplier view and an empty separate second business. Browser logs showed no errors or warnings. These checks do not establish production readiness.

Deliberate differences: exact-pence half-up material totals; quantities limited to three decimals; customer-ID filtering; recoverable tracker archive; all-or-nothing CSV and bulk writes. The order view uses browser printing rather than directly generating a PDF. Actual print/PDF saving, mobile layout and deployed behaviour remain unverified. External extraction, historical invoice backfill, tax/profitability integration and automatic quote population remain deferred. Full Materials parity is therefore partial.

## Customer, time and calendar update (0.3)

The three next manual workflows are now implemented to the limits in the table. Validation totals are 84 backend tests and 6 JavaScript tests, plus desktop save/reopen checks with invented customer, labour and booking records. A shared date/time input-state bug was found and fixed during browser verification; target dates, work dates, visit times and multi-day dates were deliberately changed and verified after refresh. See docs/VERIFICATION.md and docs/CUSTOMERS-TIME-CALENDAR.md in the package.

Full parity remains incomplete. Document lifecycle and website editing are local checkpoints. The requested provisioning/membership stage is now implemented locally; its screens still need verification. A later candidate is **private job photos and controlled gallery publication**. This recommendation grants no production or external-service authority. The table retains every other missing SHS function, including specialist modules. Existing-customer broad merges, payroll/accounting profit, recurring schedules and production identity remain separate gaps.

## Local recovery update (0.4)

A disposable loss-and-restore drill recovered both fictional businesses' rows, snapshots, images and publication boundaries, with new owner passwords, no old sessions and revoked portal codes. The full suite now passes 110 backend and six JavaScript tests. The normal demo stays empty; v0.3 and prior archives remain intact. This is a manual local whole-set tool, not production backup approval. Encryption, off-device recovery, selective business restore/merge, second-machine validation and recovery UI remain open. The browser stall remains unresolved; this milestone used no browser actions.


## Document lifecycle update (0.5)

140 backend regression tests plus seven focused date tests and ten JavaScript tests pass; the build and normal launcher/migration checks pass. New document flows are API-tested and built, with **UI checks pending**. New invoices are private drafts until issued. A focused legacy test proves v0.4 invoices keep their issued visibility, snapshots and payments. The receipt ledger, stage allocations and correction history survive a two-business loss-and-restore drill. Format-1 snapshots remain strictly supported; new backups use format 2.

Document scope remains partial: actual credits/refunds/chargebacks, negotiated replan after requests/receipts, automated reminders, full decline/signature evidence, custom/year numbering, real business/VAT/payment settings, direct PDFs and external delivery are outstanding. Sealed snapshots and explicit correction history are documented safety improvements preserving the source purpose; they do not remove those remaining functions. See DOCUMENTS-AND-PAYMENTS.md.

The v0.6 website checkpoint below follows this historical document milestone. The full white-label target continues through field/photos, staff/roles, portal, recurrence, reports/feedback/opportunities, configurable specialist contracts, integrations, PWA/offline and operational trial gates. The original 14 findings remain open against SHS. No original runtime/live data or browser retries were used.


### Website and branding checkpoint (0.6)

WEB01/WEB02 now have a local core: typed page/section editing and order/visibility, individual service routes, navigation, private owned photos, draft/preview/local publish/restore, per-business identity and optional document wording. WEB05 is partial: server HTML/social metadata, canonical links, published-only sitemaps and local noindex/robots exist; owner legal pages start unpublished. Real policy/consent, production origins, structured data and crawler/visual validation remain open. SETTINGS01 remains partial beyond identity and document defaults. WEB03 gained project collections/detail pages, categorisation, Before/After pairs and reviewed publication in v0.8; interactive verification remains pending.

190 backend tests, 14 JavaScript tests and the build pass. No new screens were browser-verified. Format-1/2/3 recovery, preserved old drafts/publications and immutable historical document branding are tested. The next suggested stage is private job photos and controlled gallery publication. Staff accounts, subscribers, domains, subscriptions, training and every other missing workflow remain in scope.


### Empty businesses, setup and memberships checkpoint (0.7)

WHITE01, AUTH01 and TRAIN01 now have a bounded local core: creation of additional empty invented businesses, same-account business switching, owner/staff memberships separated from scheduling resources, server-enforced endpoint policies, scoped single-use invitations and local reset captures, session revocation and a resumable checklist. Staff get only explicitly assigned visits and append-only work notes. SETTINGS01 includes private profile and membership settings. RECOVERY01 now preserves multiple-business identity in format 4 while strictly accepting formats 1–3 and revoking all access on restore.

228 backend tests, 18 JavaScript tests, the build and no-browser launcher checks pass. A four-business loss/recovery drill preserves inactive links and exact records. All new UI remains pending. Real onboarding, verified recovery email, subscriptions, domains, support roles, custom permissions, videos and the wider SHS functions remain incomplete. The original 14 findings remain open.


## v0.8 photo/gallery checkpoint

PHOTO01 and WEB03 now have a local core with exact-job private files, assigned staff submissions, owner review/history and separately authored customer/public projections. Arbitrary source URLs, automatic customer-name copying, raw HTML and one-step public promotion are replaced by bounded metadata-free uploads and explicit publication review. Public withdrawal blocks new direct page/API/image access while preserving private history and historical document logos. All wider field, portal, integrations and PWA gaps remain in FULL-PARITY-REGISTER.md.


## Field work and suggestions update (0.9)

Private notes/material observations/photo references, named-team server-confirmed timers, explicit owner review/correction/conversion and source-tracked quote/invoice draft suggestions now form a connected local workflow. Whole sources cannot be claimed twice; customer prices are explicit and separate from internal rates. Recovery preserves historical rates, corrected generations, media and document links while interrupting restored clocks. See FIELD-WORK-AND-SUGGESTIONS.md and the current full register. Earlier historical milestone recommendations are superseded by the v0.9 register: recurrence/calendar completion is the next bounded candidate, with all UI/mobile/offline and remaining product gaps retained.

## Recurrence/calendar update (0.10)

The source-backed CAL02 local core and appropriate CAL01 month/range/filter controls now support reviewed finite recurrence, explicit UK clock and month-end policies, stable visit identity, atomic conflicts and future rule/exception changes. Past work and ambiguous legacy links remain protected; clearly future unstarted visits have individual review without changing field/labour/photo/document history. Format-7 recovery preserves all six recurrence tables. See RECURRENCE-AND-CALENDAR.md. Earlier recommendations are historical: the current next candidate is portal completion and private document/PDF export. Interactive verification, integrations, specialist contracts and all wider parity gaps remain in the full register.

## Portal and private PDF update (0.11)

Exact-customer password setup/recovery uses protected local captures and one-use expiring codes. Deliberate quote accept/decline records immutable content/version evidence; typed names are an explicit local extension, not a certified signature claim. Private PDFs preserve exact-pence saved snapshots and old branding with separately labelled current balances. New document prefixes/year patterns and payment instructions are configurable without rewriting history. Format-8 recovery preserves accounts/history while revoking all customer credentials. Source evidence and remaining gaps are in PORTAL-AND-PDF-GUIDE.md and the full register. Browser/mobile checks and real delivery are pending. Next candidate: local source-backed feedback/review requests and moderation with explicit reviewed public projection.

## Feedback and selected testimonials update (0.12)

WEB04 now has a complete local request-to-publication journey. The source public whole-row feed is replaced by fixed name/statement/optional-rating projection. Owner edits cannot alter original customer answers or fabricate public consent. GROWTH01 includes only derived review eligibility; broader opportunities/reporting remain incomplete. Format 9 retains evidence, excludes credentials and pauses publication after recovery. See [feedback guide](FEEDBACK-AND-REVIEWS.md). All 14 original SHS findings remain OPEN.

## Preserved v0.13 operational checkpoint

The [job/follow-up/operations guide](JOBS-FOLLOWUPS-AND-OPERATIONS.md) supersedes the earlier opportunity gaps for the bounded implemented portion. Priorities/tags, next-action dates, private history, configurable repeat/quote/feedback rules, local reviewed drafts and defined totals now have API/recovery and stated browser evidence. Source name/email aggregation, status-based payment inference, fixed history cutoffs and default postcode coordinates were not copied. All broader analytics, transport, specialist and production work remain in the 45-capability register; no original finding was closed.
