# CRM local learner walkthrough and repairs

19 September 2026. Completed against local Studio0.6.2 and AppEngine0.132.0, controlled organization `ck-local-mu83iwh3`. No production changes or external provider delivery. The organization has a tested loopback SMTP catcher on127.0.0.1:2527 and no SMS-capable sending number.

## Completed running-product checks

- Created Cedar & Form — Design Enquiries through the actual empty-pipeline UI, using Default Sales Pipeline.
- Created Maya4800Referral. Reproduced lost pipeline/stage and later inconsistent Homeowner title; repaired frontend mappings. Actual Edit→reload reads Homeowner and complete kitchen/November/evening/referral notes. Both activity and next-action notes persist after reopening.
- Created design-consultation-review through the generated UI. Reload/Edit readback: service Design consultation, duration30, price0, break0, weekdays,09:00–17:00America/Chicago, spots1, venue Cedar & Form consultation.
- Created Maya booking10:00–10:30 on21September2026, reference c96e4548 (`6aae6bc72a83ec4cc96e4548`); New on creation, then explicit Confirmed survives reload. Actual next booking wizard omits10:00.
- Created Daniel booking11:00–11:30, reference c96e4581 (`6aae6c132a83ec4cc96e4581`); distinct from Maya, New. Existing Lina booking from a different course remains intact.
- Three Maya/Daniel email messages captured locally; only envelope summaries published. Actual UI reports that SMS cannot be sent because the business has no sending number. Raw mail stays private.
- Searched Daniel’s email: no lead. Actual checked Exclude existing leads nevertheless included Maya; reproduced and repaired missing exclusion implementation. Actual backend outage shows the new explicit load-failure state with Import disabled.

## Application changes

In `/Users/imzee/projects/websitemint`:

- `packages/ui/src/components/crm/leads/components/lead-form.tsx`: submit current selections rather than overwriting them with stale drawer props; read canonical/legacy title.
- `packages/ui/src/components/crm/leads/store/lead-pipeline-store.ts`: preserve title and notes in creation.
- `packages/ui/src/services/leads.service.ts`: preserve outer pipeline identity, map title consistently across detail views, preserve contact-import notes.
- `packages/ui/src/components/crm/leads/reservation-import-dialog.tsx`: implement normalized email exclusion using all pages of existing leads, clear stale selection on reload, fail visibly when verification fails, and keep reservationData in scope for actual import-error reporting.
- `packages/ui/src/components/crm/leads/__tests__/lead-form-mapping.test.cjs`: seven focused tests pass against extracted actual source methods. Includes stale selection, field preservation, server ID, legacy title, later-page/email-case exclusion, incomplete/failing lookup, and import notes.

## Evidence

[Actual API responses](assets/local-crm/api-results.json), [local mail envelope summary](assets/local-crm/mail-capture-summary.json), and numbered screenshots/text in [local-crm](assets/local-crm/).

The first coordinated8GB AppEngine rebuild included the team’s staff/schedule fixes and preserved private dist/envs byte for byte; replacement36678 healthy200. Later payroll rebuild/recovery is owned by remaining_core. Studio’s hung28920 was replaced with41619 using its exact privately preserved command/environment; entry200 and actual CRM board recovered after warm compilation. No shared data or provider settings were changed during server recovery.

## Final verified result

- Retry against the recovered backend loaded actual reservations, excluding Maya and offering Daniel/Lina. Filtered Daniel, selected only his row and pressed Import(1). Actual POST201 created lead`6aae6f604f63bd0acc35be7e`; reloaded detail retained the imported booking/service/date/party/special-request notes.
- Edited Daniel to the business pipeline/New, Website,12500 and the full21September11:00Chicago whole-home note; reloaded Edit confirms every value. Saved/reopened his next-action activity.
- Used the documented Edit→Stage alternative for Maya Contacted; full reload shows two leads totalling17300, Daniel New. History still shows its heading without entries; the course explicitly uses activities for working context.
- A separate actual UI pipeline/create check selected a different pipeline and Contacted stage, entered title/notes and saved. Fresh reload/Edit retained all four fields and server pipeline ID. Only these two temporary regression records were subsequently verified and deleted through local APIs. Final GET confirms exactly the two course leads, both stages/values and activity counts2/1.
- [Final API readbacks](assets/local-crm/final-api-readback.json), [final board](assets/local-crm/33-final-pipeline.png), [fresh-create readback](assets/local-crm/36-fresh-create-readback.png). Screenshots01–36 include original failures, fixed UI, persisted results and literal course exercises; historical screenshots remain separately labelled in the course.

Required Parts1–4 and every Try it are complete. Part5 is explanatory extension guidance, not an unperformed required project or delivery exercise. No production deployment, agreement, external message delivery, payment or project is claimed.

Final Studio recovery replaced41619 with45801 using the existing actual-Vite launcher `/tmp/stable-tutorial-studio.mjs`, original private environment, watch/HMR disabled. It re-optimized dependencies after the shared lockfile update and then served the successful final browser run. Backend payroll recovery was owned by remaining_core; PID44662 served the final operations. Scoped SMTP catcher2527 remains running for the parent task. Own isolated CRM browser context was closed after capture.

Changed documentation: only this report, the CRM course, its learner-review report, and assets/local-crm. Source changes remain the five files listed above. No central tracker was edited.
