# leaguelaw — handoff

> Append-only, **newest first**. What the last session did, what the next should
> pick up, what is blocked. Read this second (after `brief.md`) when orienting.
> Clear-after-read: once an entry is acted on it can be trimmed.

---

## 2026-08-26 (evening) — Adi + Claude — home_v1 enriched; OPEN: grid takeover entrance still "off"

Continued crafting home_v1 interactively with Adi. Added since the morning entry:

- **Locations:** option round (`locations.html`, L1–L6) → PICK: L1 baseline +
  thin-bordered white cells, open gutters (soft brand tints tried and removed
  same hour — decision trail in the CSS comments).
- **Footer:** zeina picks adapted (F2 orange CTA band + F1 four columns + H12
  hive corners); the orange/brown contact strip REMOVED — the CTA band is the
  one loud closer. Twitter icon → X glyph.
- **Photography** (Adi's policy, stated on the page): colour, 16:9 masters,
  flexible crops — monochrome-only retired. "Inside the league" filmstrip
  (3-up, real shots + dashed Nov-shoot-list frames) + single wide-crop slot
  above locations.
- **"Did you know?"** — live site's LaW Facts verbatim (6 facts), minimal
  light treatment between hairlines (dark band tried, rejected), crossfade
  rotation ← 1/6 →.
- **Consultation suite:** fixed side tab "WE'VE GOT YOUR BACK" + modal
  (two-column: photo left / form right, light logo header, flyout entrance
  from the tab's side); openers = tab + footer button + area-panel CTAs.
- **Checkerboard interactions:** attract sweep (hover-state marches text cell
  to text cell; photo zoom removed — Adi dislikes zoom); **area takeover** —
  hovering a cell (150ms intent) opens that area over the whole grid:
  sub-services as outlined BOXES (list layout rejected — keep the grid's box
  vocabulary), CTA rail, other-area quick links; leave-to-close (250ms
  grace), Esc/✕/outside click, click = touch fallback. Entrance currently:
  per-cell 3D tile-flips into the activate tint, rippling outward from the
  hovered cell, panel rises after the field turns.

**OPEN — first thing tomorrow (Adi's morning, Indonesia):** Adi finds the
takeover entrance **still "off"** even after the ripple-flip version — he is
deliberately sleeping on it (his own don't-rush rule). Do NOT ship or copy
this interaction anywhere until he settles it. Candidate directions to
explore with him: different flip axis/origin, tone-coloured (not tint) field,
boxes flipping in AS the tiles (one continuous motion instead of two phases),
or radically simpler (no ripple, one clean field turn).

Rules logged today in prototype.md: signature shape never masks photos.
Working copy: `prototyping/home_v1-v1-armstrong-checkerboard.html` → served
`wp-content/prototype/home_v1.html`.

## 2026-08-26 — Adi + Claude — home_v1 compliance build: COMPLETE full page

Rian greenlit skipping further low-fi direction work ("we ran out of time").
**`wp-content/prototype/home_v1.html`** (working copy
`prototyping/home_v1-v1-armstrong-checkerboard.html`) is a complete homepage
following `design-direction.md` literally — no rebel ideas:

- **First screen:** F3d·4 header (phone `tel:`-linked) + 5×2 triage
  checkerboard (armstronglegal.com.au reference — text/photo cells, no hero,
  no h1, all five areas above the fold; verified by headless screenshots; 📏
  fold-ruler toggle built into the page).
- **Contact band:** 2-cell league claim / 3-cell "Talk to a real person now"
  with giant phone + one-submit call-back form (UI only). Band split glued to
  the checkerboard's grid line (512/768).
- **Teams / why a league:** five team columns on the same lattice; big
  portrait crossfades through the WHOLE team (staggered, reduced-motion
  aware), roster thumbs (sliding 4-thumb window for big teams), hover bio
  cards (300ms grace, link to real `/lawyers/<slug>/` pages). **Rosters
  derived from each lawyer's actual bio in the DB** (5/9/2/5/3 across
  Injuries/Estates/Business/Marine/Real Estate; 12 lawyers). Label is
  "On your team" (hierarchy deliberately avoided — Adi).
- **Locations:** all six REAL offices (from the Contact page) each with own
  tap-to-call number. **Note: offices span BC, not just the Island** (fixed
  a wrong claim). · **Articles+FAQ:** 3 latest real posts + draft FAQ
  (schema intended on real build) on the 512/768 split. · Contact strip +
  footer.
- **Rules logged:** hexagon = ornament/accent, NEVER a photo mask (in
  prototype.md learnings). Open items for the firm/Rian: Andrew Broadley
  appears in no team (bio names no practice area); team rosters/first-call
  copy to confirm; which-number head-office wording.

Next: mobile version (sticky Call/Email bar per Adi's Armstrong note) not yet
built; page is desktop-only like the other prototypes.

## 2026-08-24 — Adi + Claude — Single-file planning master for the Rian discussion

**`.logs/planning/planning-master.md`** — consolidates ALL planning docs into
one presentable file: status · process (binding rules vs proposals) · the
anchor + photography tension · examples research + deck · the walkthrough
sample · Adi's designer inputs · and a numbered DECIDE agenda (9 items) for
Rian. Individual files remain the working truth.

## 2026-08-24 — Adi + Claude — Internal team process doc drafted

**`.logs/planning/team-process.md`** — one-page internal process for Adi,
Rian, Adi's junior, and Rob (PlusROI): roles, the 7-step pipeline (intake →
unhurried homepage-only direction craft + background obvious-work lane →
internal gate → tiny client ask → decision record → mockup phase → proposed
Measure step), Rian's binding rules separated from Adi's proposals awaiting
his OK. DRAFT — Rian to review the proposals section.

## 2026-08-24 — Adi + Claude — Design Conceptualizer v0 spec ready for Rian

Rian's walkthrough example (professormediagroup `walkthrough.html`) dissected
and mapped onto League Law: **`.logs/planning/design-conceptualizer.md`** —
context loader (all inputs already exist) · output spec (≤5-step click-through:
"what we heard" → 3 low-fi layout options → "your turn", checklist as
appendix) · capture v0 (reply in thread) vs v1 (Scout) · division of labour
(humans distill, automation runs). Internal; check-in artifact — Rian
approves/adjusts before anything is built. **A working SAMPLE of the
walkthrough now exists** (Adi asked to try it from what we know):
`wp-content/prototype/direction.html` (source
`prototyping/direction-sample-v1.html`) — 5 steps: "what we heard" (the four
rules, visually) → 3 pencil-style layout options (Front Desk / Hive / Teams,
each with a mobile view + sticky call bar + one "you'd be choosing" line) →
"your turn" (pick + comment + 2 small questions + optional checklist
appendix). Marked INTERNAL SAMPLE; step-5 controls non-functional. Awaiting
Adi's feedback, then Rian's. Examples deck re-cut to ~3 folds
into this (the options replace "rank these sites"; references become research).

## 2026-08-21 (end of Adi's day) — Rian's directions on the client ask; resume tomorrow

Adi met Rian (Rian's morning). New directions for the direction-phase ask,
captured in `adi-note.md` (top entry) — binding for the next session:

- **Fewer options** — 5 is too many; maybe **3**.
- **Shorter wording** — balance clarity and brevity; no walls of text.
- **Under ~5 minutes of client time** — genuinely easy to react to.
- **Feeling of involvement** — the client must feel part of the process now;
  jumping ahead to finished-looking mockups makes the client "fly away."

**Next session (Adi, tomorrow morning Indonesia):** re-cut the examples deck
(`.logs/planning/examples-shortlist.md`, currently a 5 + 2 proposal) to match
— which 3, whether bookends survive at that count, and wording per example
kept to one short line. Still internal until Rian sees the re-cut. No mockup
work. Also read Adi's "how the ask could actually work" paragraph in the same
`adi-note.md` entry: the client-facing ask may shift from "rank reference
sites" to **"click option 1 / 2 / 3" — three low-fi layout wireframes** built
from the client's criteria + our internal checklist (checklist as appendix,
not required reading), with the reference sites kept as our research. Not yet
decided — discuss with Rian before building either form.

## 2026-08-21 — Adi + Claude — Examples shortlist DRAFT v1 ready for Rian

Acting on Rian's review: the direction-phase work has started with Darren's own
ask — the **examples shortlist**. Draft v1 is complete and INTERNAL:
`.logs/planning/examples-shortlist.md` (finalist screenshots in
`prototyping/examples-shots/`). Nothing has gone to the client.

- ~150 law sites + ~40 non-law sites checked, every claim from a live fetch
  (law finalists also rendered in headless Chrome). Scored ✔/~/✘ against the
  four hard criteria from `design-direction.md`.
- Recommended deck (proposal): armstronglegal.com.au · co-oplegalservices.co.uk
  · usa.gov · clicklaw.bc.ca · hornecoupar.com + bookends rayslawoffice.com
  (too plain) / cagoldberglaw.com (too styled — both bookends pass the
  functional rules, so the ranking isolates taste).
- Finding worth stating: the triage-first / no-hero law homepage is genuinely
  rare — every BC/Island regional firm checked runs a scenic hero. That is the
  differentiation argument.
- Open for Rian: client-facing format (ranking page vs Scout — Darren is already
  lead there), count (5 + 2 proposed), and the timebox.
- Process lessons logged: intake now starts by reading `.logs/planning/` +
  any client-direction doc (the `design-direction.md` miss); Adi's note on
  "a pivot is a check-in" is in `adi-note.md`.

Mega menu / CTA / other-branch footer + home-v2 files remain parked.

## 2026-08-20 — Rian — Review done: pause lifted, direction phase reframed

Rian has reviewed the prototype work. **Work may resume** under the framing
below. Rian is also messaging Adi directly; this entry is the working version of
the same feedback, so any session can act on it.

**What stands from the prototype day** (kept, not wasted):

- File conventions, the served hub, versioning in `prototyping/` — binding,
  unchanged.
- The **option-funnel technique** is good mechanics; this round it was aimed at
  the wrong baseline (the current site).
- The **mega menu and the minimizable CTA are quality work parked for the
  MOCKUP phase**. They are not lost; they are early.
- The **replica is reclassified as an internal measurement artifact** —
  proportions, section inventory, brand audit. It is not client-facing and it is
  not the baseline the new design diffs against.

**The correction, in one line:** the process must produce **direction
confirmation BEFORE any mockup**, anchored on the client's written input rather
than on the current site.

- **`design-direction.md` is the anchor document.** Every artifact in this phase
  is checked against it before anyone sees it. Concretely: the J2 hero is a
  full-bleed image slider, and the client's email says no large expansive
  introductory imagery — that is the class of miss the check exists to catch.
- **Fidelity ruling (Rian's call, as yesterday's handoff requested):**
  replica-first is rejected for client-facing direction work. Early artifacts
  *losing* the old site's details is the point, not a defect — the old
  proportions belong to the design being moved away from. Deliberately
  unfinished-looking artifacts keep the conversation on structure; high fidelity
  returns at the mockup phase.
- **The target of the phase, in Rian's words:** find out whether the client
  wants "a sedan, a sports car, an SUV, or a truck" — never ask them to comment
  on the rims and the tail-lights. The client confirms a direction without
  feeling they are committing to a specific design. The client-effort rule in
  `prototype.md` applies: no extra steps, no homework for them.
- **Concrete next step: the examples shortlist.** The client already invented
  step one — Darren asked for **examples online he can rank**. Build that
  shortlist against the four hard criteria in `design-direction.md`, including
  one deliberately-too-plain and one too-styled option so the ranking locates
  where he actually sits. Client-facing deliverable.
- **Process rule, now in `agents.md`:** when an agreed approach is not working,
  the pivot itself is the check-in — flag Rian in two lines (what is failing,
  what to try instead) *before* hours go into a replacement. Design-detail
  judgment stays with the designer, as before.

**Longer term, for the process doc:** Rian suspects part of this phase
eventually gets automated (the Scout app was a first attempt at it). Keep
`prototype.md`'s distillation clean and explicit enough that a future automated
step could run it — another reason the direction inputs need to be written
documents, not tribal knowledge.

The push is timeboxed; Rian sets the box directly with Adi.

## 2026-08-20 — Adi + Claude — Prototype paused, awaiting Rian's review

Homepage prototype work is **paused at Adi's request until Rian reviews it**.
What's built (all at https://leaguelaw.demoing.info/wp-content/prototype/ —
id-auth gated; hub `index.html` lists everything):

- Canonical **header** (F3d·4 watermark hive, sticky, mega menus) + **B19
  swarm CTA** — locked through 4 option rounds.
- Canonical **hero** (J2): full-bleed November-placeholder slider,
  scroll-pinned image, form peeks at the fold, click-to-dock, minimizable
  into a right-edge tab, auto-minimize past the hero.
- Reviews band aligned to the 1280 grid. Rest of the page = 1:1 live replica,
  untouched.

**Open question for Rian:** expectations mismatch, likely a communication
gap (Adi's own assessment). Rian expects the deliverable to be the OUTPUT of
a repeatable process; Adi's approach is that the repeatable process can only
be produced by running it once for real — the homepage mockup is the test
bench, and every step/lesson is recorded into `prototype.md` (the actual
process deliverable). Also nested inside: the fidelity question (pencil
wireframes vs replica-first hi-fi). Reasoning + history in `adi-note.md`;
the distilled process in `prototype.md`. Decision is Rian's after review.
Also open: award badges need a new home (reviews bar?); FAQ section proposal.

Next session: do NOT continue prototype work until Rian has reviewed.
Conventions in `agents.md` (file locations) and `adi-note.md` are binding.

## 2026-08-20 00:42 — session ended without a handoff entry

Left in flight (4 files changed). The next session should confirm whether
this work is finished before building on it:
- `prototype.md`
- `prototyping/wireframe-asis-v1.html`
- `wp-content/prototype/index.html`
- `wp-content/prototype/home.html`

## 2026-08-10 (DONE) — Claude — Blocks converted, DB cleaned, testimonials back

**All broken blocks are gone. Every page renders real content.** The site is now
plain core blocks throughout, ready for the pattern rebuild.

### Testimonials — no repopulation was needed

All 10 rows were still in the database; the Total theme had simply been the thing
registering the post type. Registering `testimonials` in the child theme brought
every one of them back with IDs, slugs and content intact.

### Block conversion — 126 blocks across 45 items, zero content lost

Converted with a verified **text-in-equals-text-out** check: every word from a
content-bearing ACF field is confirmed present in the output. Configuration
values (`style`, `layout`, `colour`, `order_by`, icon classes) were deliberately
discarded — the check whitelists real content fields so it does not report noise.

| Old block | → became | Count |
|---|---|---|
| `acf/icontext` | heading + paragraphs | 46 |
| `acf/button` | core buttons | 41 |
| `acf/localbar` | rating line + paragraphs | 7 |
| `acf/form` | `[gravityform]` shortcode (working) | 7 |
| `acf/twocolumnsection` | linked paragraphs | 7 |
| `acf/servicethumbnail` | image + button | 6 |
| `acf/imageslider` | testimonial quotes / fact list + images | 2 |
| `acf/postgrid` | list of post links | 2 |
| `acf/lawyergrid` | `[REBUILD — …]` note (dynamic, no content) | 2 |
| `acf/hero` | galleries + form | 1 |
| `acf/servicesection` | image + heading + blurb + button per service | 1 |

**Two things worth knowing:** the "LaW Facts" slider content lived *in the block*,
not in the `law_fact` post type — all six facts are preserved as image + text.
And `acf/form` became real Gravity Forms shortcodes, so **the forms still work**
rather than becoming placeholders.

**The only intentional placeholder is `acf/lawyergrid`** (2 instances) — it listed
the team dynamically, so there was no content to carry. Rebuild it as a Kadence
query loop over the Lawyers post type.

### Database cleanup — roughly 18,000 rows removed

Orphaned postmeta (6,522), Molongui (1,541), Rank Math (5,512), Total theme
`wpex_` (906), an older theme's `cmsms_` (3,125), WPBakery `_wpb_` (99), Easy
Image Gallery (56); ~170 dead options; the `mt_pp`, `law_fact` and Total
`template` post types; dead `author` and `post_series` taxonomies; orphaned term
relationships; theme mods for deleted themes; transients.

**Deliberately preserved:** the **2 guest authors** (Rian's deferral — see
[[guest-authors]]) *and their meta*, and **`rg_gforms_enable_akismet`**, which is
a Gravity Forms option that an unanchored `%akismet%` match would have destroyed.

**Verified after cleanup:** 13 lawyers · 10 testimonials · 47 pages ·
272 published + 152 draft posts · 9 users · **3,984 GF entries** · 1,427
attachments. 46 of 47 pages render with content; the 47th is the blog index,
which is template-driven and correctly empty.

### Design direction is captured

**`.logs/planning/design-direction.md`** — the client's position in his own words:
the league-of-teams idea, contact information at the top rather than the footer,
no hero imagery or video, practice areas as immediate clickable triage zones, and
the explicit anti-goal of impressing anyone. **Read it before producing mockups.**

The hard part is named in that doc: every usual lever for "looks different" has
been ruled out, so distinctiveness has to come from typography, grid and density
rather than decoration.

**This is client direction, not internal preference** — it arrived by email on
2026-08-10. So it is a requirement, and departing from any of it needs the
client's agreement rather than Rian's alone.

**The client asked for reference examples to rank before design starts.** That is
a gate ahead of the Phase 1 mockups, and the shortlist is **client-facing**. Two
candidates were checked and both failed the brief — ConductLaw and Velkei Law each
bury the phone and require scrolling to reach practice areas. Assembling the real
shortlist is the next task; expect to look outside law, since the triage-first
pattern is rare in legal.

---

## 2026-08-10 (DONE) — Claude — Stack swapped, lawyers migrated, plugins cleared

**The theme swap, the CPT migration, and the plugin cleanup are all done and
verified.** The site is now on Kadence with the house stack. Nothing below is
blocking; the next real work is Phase 1 (design system and mockups).

### Final state

**Theme:** `kadence-child` (active) on `kadence` 1.5.1. Total and
`total-child-theme` deleted, along with twentytwentythree/four.

**Plugins (9):** `advanced-custom-fields-pro`, `wordpress-seo`, `gravityforms`,
`redirection`, `kadence-blocks`, `kadence-blocks-pro`, `kadence-pro`, `bw-dev`
1.20.0, `bw-ai-schema-pro` 2.6.0. **14 removed:** tinymce-advanced, akismet,
antispam-bee, block-bad-queries, header-footer, loftloader, mcp-adapter,
molongui-authorship, open-external-links-in-a-new-window, really-simple-ssl,
metronet-profile-picture, wp-cerber, wp-mail-smtp, wps-hide-login.

> **Note the `bw-dev` slug collision.** The old "League Law Custom Features"
> occupied the same slug as the BW library's **BW Dev**. The old one is archived
> at `.archive/old-plugins/bw-dev-league-law-custom-features-2019.tar.gz`; the
> slug now holds the real BW Dev.

**Verified after every step:** 13 lawyers, 0 problems, all featured images
present, all `/lawyers/<slug>/` permalinks unchanged, 12 clean emails (the 13th
is "IS IT YOU?", which legitimately has none). 272 published + 152 draft posts,
47 pages, 9 users, **3,984 Gravity Forms entries**, 1,427 attachments — all
intact. No PHP errors. The site returns the expected id-auth 302.

### What was built

- `themes/kadence-child/` — `style.css`, `functions.php` (parent styles + ACF
  Local JSON pointed at the child), `includes/post-types.php`, `acf-json/`.
- **`lawyers` CPT** registered in `includes/post-types.php`. **Both traps are
  handled and commented in the code** — the rewrite slug is hardcoded to
  `lawyers` (it used to come from a Total theme mod that died with the theme),
  and `has_archive` is `false` (the page "Our Lawyers" holds the slug `lawyers`
  and would collide).
- **`acf-json/group_lawyer_details.json`** — one `email` field, editable in the
  UI, versioned on disk.
- Migration ran as a **direct DB `post_type` update**, deliberately not
  `wp_update_post()`, so slugs could not be regenerated. Emails were extracted
  from the old ACF Link values (`url`, minus `mailto:`, trimmed).
- Dropped as agreed: `position`, `phone`, their Total equivalents (66 meta rows),
  and the `staff_category` taxonomy (3 terms, 12 relationships, plus 21 stale
  Yoast/RankMath primary-term rows).
- All **18 legacy ACF field groups** deleted (84 fields + 20 orphan rows).
  **Definitions exported first** to
  `.archive/old-acf-field-groups/old-acf-groups.json` — useful when rebuilding
  Icon Text and friends as Kadence patterns.

### Snapshots and archives

- `.snapshots/leaguelaw-pre-theme-swap-20260810-2020.sql.gz`
- `.snapshots/leaguelaw-pre-lawyers-migration-20260810-2110.sql.gz`
- `.archive/old-plugins/` — removed plugins (9.1 MB), Total theme (5.6 MB), old
  bw-dev (40 KB)

### Loose ends, none blocking

- **Four orphaned post types remain in the database** now that their plugins are
  gone: `testimonials` (10), `mt_pp` (8), `guest_author` (2), `law_fact` (1).
  Rows are inert and invisible. `testimonials` needs a real decision (rebuild as
  a CPT, or convert to content); the other three are for disposal once
  [[guest-authors]] is settled.
- **Content still contains `wp:acf/*` block markup** in ~43 items. Those blocks
  are now unregistered, so they show as unsupported in the editor. **This is the
  strip pass — still to do**, and it must extract the JSON payload into
  `[REBUILD — …]` placeholders rather than deleting the markup.
- **Two removals to re-check before launch**, both raised and confirmed:
  `wp-mail-smtp` (Gravity Forms notification delivery — **test that form mail
  still arrives**) and `wps-hide-login` + `wp-cerber` (login is back at the
  standard `/wp-login.php`; fine behind the id-auth gate, worth a decision for
  production).
- **352 orphaned postmeta rows** across 88 long-deleted post IDs were found and
  **left alone** — pre-existing cruft, unrelated to this work.

---

## 2026-08-10 (current) — Rian — `staff` becomes a `lawyers` CPT

**Read [`.logs/planning/lawyers-cpt-migration.md`](planning/lawyers-cpt-migration.md)
before touching the lawyer records.** Summary of what changed this round:

- **New `lawyers` post type** with **position, phone, email** fields, replacing
  Total's `staff`. Migrate by changing `post_type` on the existing 13 rows —
  never re-create posts. IDs and slugs stay, so **URLs do not change**.
- **`redirection` is KEPT.** Removed from the deletion list.
- **Metronet cross-checked and is safe to remove** — every lawyer already has a
  featured image, and Darren's is the same attachment the plugin holds.
- **Layout is not preserved anywhere.** Content migration only.

### The three things most likely to go wrong

1. **`has_archive` must be `false`.** The page "Our Lawyers" (ID 14661) has the
   slug **`lawyers`** — identical to the CPT rewrite slug. It only works today
   because Total sets `has_archive => false`. Give the new CPT an archive and it
   collides with that page.
2. **The `lawyers` slug lives in a Total theme mod** (`staff_slug`), so it
   vanishes when Total is deactivated. **Hardcode** `'slug' => 'lawyers'` in the
   new registration.
3. **`email` and `phone` are ACF *Link* fields, not text.** They hold serialized
   `title`/`url`/`target` arrays. Take **`url`** for email (strip `mailto:`, then
   trim — three records have a stray space) and **`title`** for phone (the `url`
   half is broken on 6 of 13, e.g. `http://250-888-0002`).

### Good news

**No data entry needed** — position, phone and email already exist on all 13, and
**all 13 already have featured images**, so "header image becomes featured image"
turns out to be a no-op. There is no per-lawyer header field; the only one is a
global options-page image for the lawyers page header.

### All open questions answered by Rian 2026-08-10 — nothing blocking

- **Joji Kawaguchi** → use `jkawaguchi@leaguelaw.com`; the other address predates
  a name change.
- **Janice Williams is not a lawyer** — no record. She runs the blog. This has a
  consequence for the schema work; see below.
- **Drop `position`, `phone`, and the `staff_category` taxonomy** — all stale or
  duplicated. **The `lawyers` CPT ends up with a single field, `email`.**
  *(Expect a position field to return with the roster refresh — Person schema
  wants `jobTitle`.)*
- **"IS IT YOU?"** migrates as-is for now; it becomes a CTA during design.

### ⚠️ The finding that matters most: 38% of the blog is credited to a non-lawyer

**103 of 272 published posts are credited to Janice**, who publishes them rather
than writing them. The add-on's headline promise is tying **lawyers** to the
articles they wrote — so a third of the library currently credits the office
administrator for the firm's expertise.

Checked so nobody re-checks: **Molongui adds no correction** (its author values
match `post_author` exactly on every post), and **no post carries an in-content
byline**. There is no hidden data to rescue.

**But it is cheap to fix** — the content clusters hard: 73 Estate Law, 70 Wills
and Estates, 68 Estate Planning, 38 Estate Disputes, only 31 Personal Injury. So
it needs a few answers by topic and date range, not a 103-row list. Full detail
and how to raise it: `.memory/author-attribution.md`. **Raise it when the add-on
is confirmed — it is add-on scope, not base scope.**

---

## 2026-08-10 (latest) — Rian — Stack cleanup specified; DB snapshot taken

**Read `.logs/planning/build-plan.md` §Stack cleanup before removing anything.**

**Target stack: Kadence + ACF + Yoast + Gravity Forms.** Everything else goes. No
template clone — a clean start on the new theme, on this database. **All 424 posts
are kept, drafts included.**

### 🛑 The one thing that will bite you: Total owns the lawyer post type

`staff` and `testimonials` are registered by the **Total theme**
(`themes/Total/framework/classes/PostTypes/`), not by any plugin. Remove Total
before the child theme re-registers `staff` and **all 13 lawyers vanish** from
wp-admin and the front end. The rows survive but are orphaned and invisible,
which looks exactly like data loss.

**Order: build the Kadence child theme → re-register `staff` (same key, same
`/lawyers/` slug) → verify all 13 lawyers list in wp-admin → then remove Total.**

### Answering Rian's question: `bw-dev` has nothing worth rebuilding

"League Law Custom Features" is a 2019 scaffold that ended up nearly empty — it
registers `law_fact` (being dropped), points ACF Local JSON at a directory that
is **empty**, enqueues a **37-byte** stylesheet, and the rest is commented-out or
stub files. **Safe to delete, nothing to rebuild.** One follow-up: create
`acf-json/` in the Kadence child theme so field groups sync to disk in the new
location.

### Four plugins need a decision, not a straight delete

- **`redirection`** — holds the existing redirect map. **Export the rules before
  removing it**; we owe the client a redirect map and rebuilding it from scratch
  is avoidable work.
- **`wp-mail-smtp`** — mail delivery. Dropping it can silently kill Gravity Forms
  notifications, which for a law firm means lost enquiries.
- **`metronet-profile-picture`** — owns `mt_pp` (8 entries), the author avatars.
- **`really-simple-ssl` / `wp-cerber` / `block-bad-queries`** — likely redundant
  on Flywheel, but confirm rather than assume.

### ACF: keep the lawyer fields, strip the blocks

Keep **`Lawyers Settings`** (attached to `post_type == staff` — the per-lawyer
fields). Remove the other 16. **`Lawyer Settings` is a separate options page**
holding one field, `lawyer_header_image` — recommend dropping, Rian to confirm.

**Three block groups are already dead** (Post Grid, Two Column Section, Local Bar
— zero instances) and need no placeholder. Real usage is **Icon Text 44**, Form 9,
Button 7, then Service/Lawyer Grid/Hero/Image Slider at 1–2 each. Icon Text is the
pattern most worth getting right early.

**When stripping ACF blocks, extract the content — do not just delete the
markup.** The field values live as JSON inside the block comment, so deleting the
comment deletes the copy and fails the text-in-equals-text-out check. Put the
values into a `[REBUILD — <block>]` placeholder. Full detail in the build plan.

### Done this session

- **DB snapshot taken and verified:**
  `.snapshots/leaguelaw-pre-theme-swap-20260810-2020.sql.gz` (7.6 MB, 126 tables,
  users/posts/postmeta/gf_entry all confirmed present).
- **Note `wp db export` does NOT work here** — no `mysqldump` inside the
  WordPress container. Take snapshots from the host with `mysqldump` reading
  credentials from `.env` via a `--defaults-extra-file` (never on the command
  line, where the password would land in the process list).
- Guest-author decision recorded as deferred in `.memory/guest-authors.md`.

---

## 2026-08-10 (later) — Rian — Both decisions answered; Adi is unblocked

**Rian settled the two open questions. Nothing is blocked — Phase 0 can start.**

### 1. Build environment: keep this database, swap the theme

`wp-content/` here is a **fresh pull of the live site** (uploads re-synced
2026-08-09) and it is what we build **on**. No separate reference copy — the live
site at `www.leaguelaw.com` is the visual "before" whenever we need it.

**Do not start a fresh WordPress install.** Rian's requirement is that logins,
posts, pages, forms and entries all survive, and that only works if the database
survives. WordPress password hashes are self-contained (they do not depend on the
site's salts), so keeping `wp_users`/`wp_usermeta` keeps every login working —
whereas a fresh install plus a content import would silently reset all of them and
lose 3,929 Gravity Forms entries.

So: **keep the DB, install Kadence, switch the theme, strip the content back to
plain blocks, rebuild the presentation as patterns.**

### 2. The AI add-on is `bw-ai-schema-pro`, configured — not built

Nothing custom gets written. The plugin already renders firm, location, service,
FAQ and Person schema. The only prerequisite Rian named is a **team post type** —
and the plugin reads that from a setting rather than hardcoding it, so the
existing `staff` CPT (13 entries) just needs mapping. `staff` is already one of
the plugin's default team slug patterns.

Bonus worth knowing: the plugin ships a **team survey workflow**
(`docs/SPEC-team-survey.md` in the plugin) that collects credentials and areas of
expertise and publishes them into the Person schema fields — which is precisely
the "we research the team's baseline info, you finalize it" deliverable in the
proposal. Read that spec before scoping the work.

**Still pending:** the client has not formally accepted the add-on yet. Rian is
following up. Do not start Phase 3b until he confirms.

### The good news on content — it is much cleaner than expected

Measured against the fresh pull. **Zero WPBakery. Zero proprietary theme blocks.**
46 of 47 pages and 171 of 272 published posts are already core Gutenberg blocks,
with almost no layout scaffolding (0 groups, 0 covers, 0 button blocks).

So **do not run a blanket rewrite over everything** — that is pure risk. The real
work is a **targeted strip pass over roughly 70 items**: 43 ACF blocks, 32 with
shortcodes, 9 raw HTML blocks, 9 columns and 7 spacers. Full table and the
non-negotiables (snapshot first; text-in-equals-text-out; never touch `wp_users`
or `gf_*`; never re-slug) are in `.logs/planning/build-plan.md` §Content
conversion. **Read that section before writing any conversion script.**

### Start here

1. **Snapshot the database.** Before anything else, and before the strip pass.
2. Capture the **before** baseline from production: Core Web Vitals plus the full
   page and URL inventory. Once we start changing things that chance is gone.
3. Install Kadence + child theme and the standard plugin set; switch the active
   theme off `total-child-theme`.
4. Run the targeted strip pass with the text-in-equals-text-out check.
5. Then Phase 1: design system and mockups, which is the client gate.

**Two things needing a human answer, neither blocking the start:** whether the
**152 draft posts** migrate (only 272 of the 427 are published), and the team
roster — 13 staff entries including a placeholder titled "IS IT YOU?", and Natasha
Gordon on the client thread with no staff entry at all.

---

## 2026-08-10 — Rian + Claude — Project sold, workspace scaffolded, Adi added

**Where things stand.** The client accepted the proposal on **Option 2 (Design
Modernization)**. Target launch is **November 2026**, and we can start whenever
ready. Nothing has been built yet. This session set up the workspace, added Adi
to the project, and wrote the docs you are reading.

**For Adi — read `brief.md`, then `.logs/planning/build-plan.md`, then this.** The
short version of what you are building: League & Williams' existing site, brought
current, assembled from a small unsynced pattern library rather than bespoke
pages. Not a redesign — the client would not have bought that.

### Blocked on Rian — do not start Phase 0 until these are answered

1. **Where do we build?** `wp-content/` in this project is a **clone of the old
   production site** (Total theme 4.8.4, 427 posts, 47 pages, 1,400+ media). It
   is the reference copy, not the thing to restyle. The rebuild needs its own
   Kadence environment. Two obvious options: a fresh project alongside this one
   (which keeps the old site available side-by-side for comparison), or a fresh
   install here with this copy archived first. **Rian decides.**

2. **Is the AI Search Optimization add-on in?** Still unconfirmed with the client.
   It changes how much author and per-lawyer schema structure gets built into the
   templates, so it is worth knowing before Phase 2. **Do not build it until Rian
   says yes.** Note the base-scope schema fix — correct firm address, correct
   practice areas — is separate and *is* in scope regardless.

### Then, first real work (Phase 0)

- Capture the **before** baseline from production: Core Web Vitals plus a full
  page and URL inventory. The proposal promises before/after numbers, and once we
  start changing things the chance to measure the "before" is gone.
- Audit the 47 pages and 427 posts: migrate / merge / retire-with-redirect.
- Get the **team roster** confirmed through Rob or Rian. There are 13 staff
  entries including a placeholder literally titled "IS IT YOU?", and Natasha
  Gordon is on the client email thread with no staff entry at all. Bios and
  November photography both depend on this.

### Things worth knowing before you start

- **Photography is placeholder until November.** The client reshoots office and
  staff photos then. Crop placeholders to the final aspect ratios so the real
  images drop in without re-layout, and always label a placeholder as one when
  the client sees it.
- **Patterns are the build method, and there are two ways to get them subtly
  wrong.** Both are covered in `.logs/planning/build-plan.md` §Patterns — read
  that section before building the first pattern, not after. The short form:
  insert unsynced *and unlocked*, and explicitly declare every block type used
  inside a pattern as editable or images and buttons go inert.
- **The live site is off limits.** `www.leaguelaw.com` is production on Flywheel.
  There is no push script here and one should not be added without Rian setting
  the deploy path.
- **The DB table prefix is `wp_eopoktulnc_`**, not `wp_`. Queries against `wp_posts`
  will silently return nothing useful.
- **Useful findings already in hand** (these were the basis of the pitch, so they
  are real work items): production schema still lists the **old Wilson St
  address**; the firm is described only as a "personal injury attorney in
  Victoria" despite four practice areas and six cities; and there is no Article or
  Person schema anywhere, so 427 posts since 2014 earn no author authority.

**Files:** the signed proposal and the client email thread are in `notes/`.
