# Repeat work verification

30 October 2026. **The bounded owner recurrence and calendar journey passed on v0.20.1 using invented records.** v0.20.2 corrects a small display defect: a removed holiday block rendered a stray “0” because its saved inactive flag is numeric. The fix converts that display condition to a boolean; it changes no scheduling rules or records. The display repair has passed client/render/build checks. Its final browser retest is pending: automatic approval review rejected signing into the fictional demo without fresh explicit permission.

This is a local trial checkpoint. Full product parity, phone/PWA use and live SHS approval remain open. All 45 capabilities remain tracked and all 14 original SHS findings remain OPEN.

## Practical owner walkthrough

1. In **Repeat work**, create a named definition and choose the exact customer job and people. Set a finite end date. **Save definition only** creates no visits.
2. Choose **Generate a window**, inspect every proposed date and UK time, correct any conflicting Calendar entry, then preview again. Tick the review acknowledgement and confirm. A conflict or stale preview prevents the whole change.
3. Use each visit’s **Review reschedule** or **Review cancellation** for one-off changes. The original date remains its identity after a move. Generating the same window again does not duplicate visits or recreate a deliberate cancellation.
4. Add holiday blocks with inclusive dates. Removing one block restores only visits no longer covered by another block. Use **Change future pattern** for a dated revision; already saved later visits are also reviewed outside the chosen generation window.
5. Pause or retire a definition to stop further generation. Existing visits remain. Restoring a retired definition leaves it paused; **Resume** is a separate choice. Jobs with completed work require separate review, and past visits stay read-only.

## Actual browser results

| Journey | Observed result | Evidence |
| --- | --- | --- |
| Definition and unfinished input | Missing-person validation kept the fields; leaving raised a warning and Keep editing retained the definition. Saving created no visits. | 02–04 |
| Conflict and calendar correction | A clash on 9 November blocked all five proposed visits. Moving the fictional absence to noon in Calendar cleared the conflict. | 05–09 |
| Stale preview | A second editor changed Calendar after preview. Confirmation was rejected; dates remained entered. A fresh review saved exactly five visits. | 10–12 |
| Duplicate prevention | Repeating the window showed zero changes. Generated Calendar entries link to Repeat work and disable ordinary archive. | 13–14 |
| Move and cancellation | The original 2 November visit moved to 3 November, 13:00–14:00; 9 November was cancelled. Repeating generation retained both decisions. | 15–21, 61 |
| Overlapping holidays | Blocks 16–23 and 23–30 November overlapped. Removing the first restored 16 November; 23 and 30 remained excluded. | 22–27 |
| Future rules | A rule effective 16 November moved that visit to 10:00. Saved 23/30 November visits were included even with a one-day generation window and remained excluded. Original rules stayed intact. | 28–29 |
| Pause and retirement | Pause, retire, restore-as-paused and explicit resume left occurrences, calendar records, rules and blocks unchanged. A paused generation was rejected. | 30–38 |
| Completed and past work | Bulk change held three future visits on a job with completed work. Separate acknowledgement was required. A past cancellation was blocked; one individually reviewed future cancellation preserved work and invoice history. | 39–44 |
| Month ends and clocks | Monthly day 31 with last-day policy saved 31 January, 28 February and 31 March, showing GMT/BST correctly. Missing 28 March 01:30 was blocked, then explicitly skipped with a retained exclusion. | 45–55 |
| Archived people | Archiving the fictional Casey resource prevented generation of a previously saved pattern using Casey. No booking was created. | 56–58 |
| History and isolation | Saved definition/original-generation review remained readable. Harbour’s Repeat work and Calendar were empty. | 59–60, 62–63 |

The numbered observations and screenshots are in [recurrence-evidence](recurrence-evidence/). Observation 39 captured a brief loading state; the fully loaded protected definition and its reviewed rows are shown in 40–44. The saved review viewer currently exposes technical JSON; a more readable presentation remains a usability improvement.

![Moved visit keeps its original date identity](recurrence-evidence/61-calendar-moved-visit.jpg)

## Evidence boundaries

The three base jobs, named people, one conflicting absence and protected work scenario were deliberately created by TestClient before browser work. The protected fixture contained one completed two-person capture, two labour entries, a private field note and one issued £0.67 invoice. Five protected recurrence visits were also seeded, including 19 and 26 October in the past. These setup steps are not browser proof. Browser time was the actual London date; only fixture setup used an earlier date.

The owner then used actual UI controls for all numbered recurrence/calendar transitions. There were no new customer/staff accounts or passwords. The initial 60 targeted recurrence/calendar/recovery tests ran against the unchanged v0.20.1 backend. The v0.20.2 frontend passed 167 client tests, 74 general plus 14 reporting structural renders, and a build. Structural rendering is not phone or accessibility proof. The earlier full 694-case v0.20 backend result remains historical.

103 separately labelled HTTP checks confirmed private definition/history/review/calendar-history denial for anonymous and foreign-business access, an empty second business, and nonconfirmable repeat previews. Read-only saved-record comparisons verified stable original occurrence/booking/customer/job identities, unchanged original rules and both past visits, and unchanged work/finance records. Planning created no labour, invoice, receipt, payment, message or external calendar event. The server’s outbound guard remained enabled.

## Backup and recovery

After stopping the test server, the actual saved browser dataset was backed up. The source folder was **moved to qa-source-retained, not deleted**, and the backup restored into a fresh folder. All 5 definitions, 8 rules, 14 occurrences, 2 holiday blocks, 18 saved reviews, 60 recurrence history rows and 14 calendar bookings survived exactly, with complete calendar history. Original IDs, bindings, overrides, cancellations, removed/active blocks, paused/retired states and completed work/financial histories were preserved.

Recovery changed only the expected portal invalidation fields, recovery audit event and dataset identity. Two old owner sessions and both old public demo passwords were denied. Read-only previews created no duplicate visits or work, and a second-generation backup verified. This is stopped-data and TestClient recovery on this Mac, not restored-browser or second-machine recovery. Backend/schema/dependencies/lockfiles/207 route policies are unchanged; recovery format 12 and backup metadata 0.20.0 remain compatible with the supported older formats.

## Remaining scope

Representative weekly/monthly and spring-clock UI cases do not certify every fortnightly/quarterly/yearly, leap-year, repeated autumn-hour, all-day or midnight scenario; targeted automated tests cover those edges. Staff/customer portal recurrence views, offline capture, practical phone/accessibility use, specialist rate/batch-billing behaviour and occurrence-linked field records remain separate gaps. Existing field records have not been guessed onto occurrences. Source job/enquiry/personal/admin distinctions and commercial integration choices remain visible in the parity register.

The earlier upload limitation remains: new-format file selection and selected-file Keep/Clear/discard are unverified. GIF/TIFF/BMP, larger images, sequence/multiple-main-image/AVIF/other codecs, phone/HDR variants, authenticated upload differences, native redistribution/licensing and complete source/assets/configuration remain open. Nothing in this recurrence check approves those areas or changes Sandy’s frozen v0.19 review at localhost:8789.

## Source comparison and preservation

[source-map.json](recurrence-evidence/source-map.json) distinguishes the original filtered export from the independent implementation. The original weekly generator could save nonconflicting dates while skipping others, used narrower conflict matching, and queued Google Calendar work; holiday cancellation deleted bookings. The local design retains the scheduling purpose with complete review, atomic changes, retained history and explicit restoration. External calendars and billing are not implemented by pretending that local planning completes them.

The original ZIP, source copies, v0.19 review environment and normal data were not changed. The first test server on 8792 was stopped and its two tabs closed. A separate copy on 8793 is used only for the small display repair. See the cleanup and repair records for its final state. Prior versioned archives and tags remain immutable. The gallery clarification records that the old withdrawn-state private-marker flag meant “not applicable”, not a detected leak; the old evidence is preserved.
