# Brentwood Migration — Detailed Task Breakdown (Backlog)

**Status:** DRAFT — authored 2026-06-03 by Adi (with Claude). Feeds the task tracker.
**Companion to:** [`10-WEEK-PLAN.md`](./10-WEEK-PLAN.md) (milestones/sequence) · `PROJECT-BRIEF.md` (scope, authoritative).

This is the granular list of work items. The junior team (IJ · RQ · YM) works as **one shared pool** —
no fixed per-person lanes; **ZR** assigns/reviews. Owner hints: **AP** (lead) · **ZR** (Adi's Assistant /
Kadence) · **J** (shared juniors) · **RB** (client/business) · **AI** (automation assist).

**Sizing:** items marked **⏱️size-after-W1** can't be estimated until the Week-1 DB counts run (see
`10-WEEK-PLAN.md` → Pages deep-dive). 🔒 = blocked/constrained (dependency noted). 🧩 = dynamic
(Vue-today → rebuild as block JS).

---

## E0 — Discovery, setup & planning
- [ ] **E0-1** (AP) Run the DB tiering counts on the mirror (block-type counts, elements-per-page, placement-flag usage, legacy-URL counts) → turn page/block tiers into real numbers. ⏱️
- [ ] **E0-2** (AP) Finalize the **block catalog** (the ~18 content-element types → WP block list + tier).
- [ ] **E0-3** (J, AP) Build the **page inventory**: every page → tier A/B/C + which blocks it uses + bespoke-override flag.
- [ ] **E0-4** (RB) FinalSite discovery call (with Tracy): confirm embed + hidden-field limits. 🔒 gates E11 campaign/journey items.
- [ ] **E0-5** (RB) Confirm livestream "old way" with Brentwood IT (any stream path other than YouTube embed / Hudl link?).
- [ ] **E0-6** (RB) Gather brand assets (logos, typography, approved photography).
- [ ] **E0-7** (AP) Stand up the task tracker from this backlog; agree the diary/reporting cadence.
- [ ] **E0-8** (AP, RB) Confirm header/footer approach (Kadence vs child-theme — design-latitude decision).

## E1 — Environments & deployment pipeline
- [ ] **E1-1** (AP, RB) Provision the DigitalOcean **staging** droplet.
- [ ] **E1-2** (AP) Security pass on SSH key/credential handling before any access is stored (per brief §10).
- [ ] **E1-3** (AP) Wire dev (mosiah) → staging deploy flow; document it.
- [ ] **E1-4** (AP) Confirm PHP/WordPress/MariaDB versions match the launch target (live = DO).
- [ ] **E1-5** (AP) Staging access for the client to review (behind the demoing gate or DO equivalent).

## E2 — Template framework & site chrome
- [ ] **E2-1** (ZR) Carry over palette, typography, spacing from the current site into the theme (Kadence global styles).
- [ ] **E2-2** (ZR) **Header** — build in Kadence Header Builder/Elements (client-editable); deep nav + sub-menus from the page hierarchy. 🧩 (current nav is dynamic)
- [ ] **E2-3** (AP) Header — child-theme override only for parts Kadence can't express.
- [ ] **E2-4** (ZR) **Footer** — Kadence; wire the per-page footer-image ACF field (E7-3).
- [ ] **E2-5** (ZR) Reusable layout patterns / template areas for page types.
- [ ] **E2-6** (ZR, J) Mobile-first responsive pass on the framework.
- [ ] **E2-7** (AP) Page templates for: default page, hub/landing (`hub`), and the bespoke overrides (`parents`).

## E3 — Block library (build-once content-element blocks)
*Each content-element type → a Gutenberg/ACF block. Tier = effort. These gate junior page assembly (Week-2 block sprint).*

### T1 — Static (low effort, ~1:1)
- [ ] **E3-1** text-block (rich text + header; note `side_text` variant)
- [ ] **E3-2** quote
- [ ] **E3-3** titles / heading
- [ ] **E3-4** photo (single image; preserve alt/caption; flags: retina, border, enlarge, hide_mobile, vertical_span)
- [ ] **E3-5** embed-code (raw HTML)
- [ ] **E3-6** youtube-video
- [ ] **E3-7** embed-video (note `fill`, `show_text`)
- [ ] **E3-8** timetable → **static image/PDF** (descoped from interactive — trivial)

### T2 — Composite (medium)
- [ ] **E3-9** photo-block (+ `-text` variant; `layout`, `text_first`) — **the workhorse block** ⏱️ (highest volume)
- [ ] **E3-10** slideshow 🧩 (carousel JS)
- [ ] **E3-11** inquiry-form — FinalSite embed wrapper 🔒 (E0-4)
- [ ] **E3-12** course-description (ACF block bound to a Course)
- [ ] **E3-13** social-media-feed 🧩 (3rd-party widget)

### T3 — Dynamic / query-driven (high — the real engineering) 🧩
- [ ] **E3-14** content-filter (tag-driven aggregator + inline filter UI; has `stats`/`title`/`multiple`/`style`)
- [ ] **E3-15** course-list (query Courses CPT by dept/grade; `show_profiles`, `profiles_title`)
- [ ] **E3-16** staff-profile-list (query Staff CPT; grouping/filter)
- [ ] **E3-17** livestream-list (query Livestream CPT; upcoming/live/completed states + filter)
- [ ] **E3-18** publication-list (blog/news listing; `number_of_items`, `max_items`, `hide_paginator`, `layout`)
- [ ] **E3-19** calendar block → see E7-1 (custom calendar)

### Cross-cutting (placement behaviors — NOT a block; one shared solution)
- [ ] **E3-20** (AP) Placement-behavior wrapper: `expandable` (inline + modal), tag `filter`, `randomize`, `no_margin`, `hide_print`, `guest`-only, `unlisted`/anchor. Reused across blocks. ⏱️ (easy to under-estimate)

## E4 — Migration extractor (scripted, re-runnable)
- [ ] **E4-1** (AP, AI) Read mirror DB; walk `content_elements` per page in pivot `sort_order`, **published version only**.
- [ ] **E4-2** (AP, AI) Map `content_type` → block; emit block markup / ACF payload per type.
- [ ] **E4-3** (AP) Carry pivot settings → block attributes (the E3-20 behaviors).
- [ ] **E4-4** (AP) Preserve tags + tag→section relationships.
- [ ] **E4-5** (AP) Photos: copy with alt/caption; map to WP media library; handle photo flags.
- [ ] **E4-6** (AP) Internal link rewriting (replicate `PageLink` behavior).
- [ ] **E4-7** (AP) Page hierarchy → WP parent/child + nested slug; preserve URLs.
- [ ] **E4-8** (AP) Re-runnable / idempotent; logs unmapped elements for manual follow-up.
- [ ] **E4-9** (AP) Dry-run reports (counts migrated vs skipped) for QA.

## E5 — Custom post types & templates
- [ ] **E5-1** (AP) **Posts** (student blogs + news/events/announcements): index + single templates, thumbnail, categories, excerpt. Preserve URL/author/date/tag.
- [ ] **E5-2** (AP) **Staff** CPT: fields first_name, last_name, title, credentials, bio, body, departments, photo; link to user (Google login). Index + single templates.
- [ ] **E5-3** (AP) Staff **bio pending-review** workflow (maps `bio_draft` → WP revisions/pending). (See E8.)
- [ ] **E5-4** (AP) **Courses** CPT: fields body, credit, header, layout; **department + grade taxonomy**; course↔staff link (`show_profiles`). Index + single templates.
- [ ] **E5-5** (AP) **Livestream** CPT: start_date, length, url, video_id, will_be_recorded, location; **auto live/completed state**; single page template. Exclude chat/RSVP/login-gating (per brief).
- [ ] **E5-6** (AP) Taxonomies/tags shared across CPTs; tag→section relationships retained.

## E6 — Content migration runs & cleanup
- [ ] **E6-1** (AP) Extractor dry-run: bios, courses, blogs → verify structure. ⏱️
- [ ] **E6-2** (AP) **Full extractor run** (pages, 700+ blogs, 168 bios, 141 courses, photo library).
- [ ] **E6-3** (J) **Tier-A pages** cleanup pass (simple text/photo stacks) — bulk. ⏱️
- [ ] **E6-4** (J, ZR) **Tier-B pages** cleanup (mixed blocks/slideshows/embeds) — visual-parity check. ⏱️
- [ ] **E6-5** (AP, ZR) **Tier-C / landmark pages** (home, admissions hub, athletics, arts, /live, /giving, calendar pages, `hub`/`parents`) — hand-built/heavy. ⏱️
- [ ] **E6-6** (J) Blogs QA: URL/author/date/tag preserved; tag→section surfacing (e.g. athletics blogs on athletics page).
- [ ] **E6-7** (J) Bios QA: 168 profiles complete, photos, departments correct.
- [ ] **E6-8** (J) Courses QA: 141 courses, dept/grade taxonomy, staff links.
- [ ] **E6-9** (J) Media library: alt text + captions preserved; clean up orphaned images.
- [ ] **E6-10** (J) Self-hosted video files (~81, ~9.7 GB) migrated and playing (incl. homepage hero).

## E7 — Custom features
- [ ] **E7-1** (AP) **Custom Calendar** 1:1: multi-source Google (Brentwood/Socials/Admissions/Box Office), per-source color, list/grid layouts, tag filtering, per-page header/body, per-page source combos. 🧩
- [ ] **E7-2** (AP) **Video Hero block** (autoplay, mute toggle, fallback image — match `/giving`).
- [ ] **E7-3** (AP/ZR) Per-page **footer image** (ACF field) — wired into footer (E2-4).
- [ ] **E7-4** (AP) **Google Login** (match current login experience; ties to Staff `user_id`).
- [ ] **E7-5** (AP) **Campaign-variant inquiry forms + thank-you pages + conversion events**. 🔒 (E0-4)
- [ ] **E7-6** (AP, ZR) **Campaign Landing Page template system** (marketing self-serve clone).
- [ ] **E7-7** (AP) **Blog auto-archiving**: configurable N-years filter out of on-site queries while keeping posts published + search-reachable.

## E8 — Roles, permissions & content approval
- [ ] **E8-1** (AP) Collapse 118 permissions → ~8 practical roles (Admin/IT, Marketing, Teachers, + WP core).
- [ ] **E8-2** (AP) Lock the 7–8 core admissions/brochure pages to Marketing+Admin; others read-only there.
- [ ] **E8-3** (AP) Remaining pages on existing trust-based model.
- [ ] **E8-4** (AP) Content-approval: native WP revision + pending-review queue (esp. teacher bios).

## E9 — SEO, redirects & URL preservation
- [ ] **E9-1** (AP) Correct heading structure across templates.
- [ ] **E9-2** (AP) Schema: Organization, EducationalOrganization, Person (staff), Course. (AI-assisted)
- [ ] **E9-3** (AP) Clean XML sitemap; Open Graph meta; thin-page blocking; site search.
- [ ] **E9-4** (AP) **301 redirect map for every legacy URL** (from `page_slugs` / `page_redirects`). ⏱️
- [ ] **E9-5** (J) Redirect verification pass (no broken legacy links).

## E10 — Performance, caching, backups, image optimization
- [ ] **E10-1** (AP) Image auto-optimization via **bw-dev** plugin — set up profiles (replaces broken tool).
- [ ] **E10-2** (AP) Page caching + CDN layer (Core Web Vitals).
- [ ] **E10-3** (AP) Daily DB backups + weekly full-site backups, off-server, **verified restorable**.

## E11 — Tracking & analytics  🔒 (most gated by E0-4)
- [ ] **E11-1** (AP) GA4 + GTM + Meta Pixel baseline.
- [ ] **E11-2** (AP) Per-form conversion events + cross-domain to the application platform.
- [ ] **E11-3** (AP) First-Party Journey Tracking via **BW Lead AI** plugin (landing page, UTMs, referrer, multi-session cookie).
- [ ] **E11-4** (AP, RB) Investigate pushing journey data into FinalSite (open question).
- [ ] **E11-5** (AP) **Looker Studio** dashboard: ad spend → inquiry → application funnel, per campaign.

## E12 — QA
- [ ] **E12-1** (J) Cross-browser + responsive pass (all templates + landmark pages).
- [ ] **E12-2** (J) Link integrity + redirect verification (sitewide).
- [ ] **E12-3** (AP, J) Form testing incl. FinalSite embeds + Gravity Forms.
- [ ] **E12-4** (AP) Tracking validation (events fire, cross-domain works).
- [ ] **E12-5** (AP) SEO continuity check (titles, meta, schema, sitemap).
- [ ] **E12-6** (ZR) Build + burn down the punch list from the stakeholder review.

## E13 — Training & handover
- [ ] **E13-1** (RB, AP) 2-hour editor training session (5–10 staff), **recorded**.
- [ ] **E13-2** (AP) Photojournalism-teacher student-blog workflow video.
- [ ] **E13-3** (AP) Documented image/video specs + upload validation (resolution, bitrate, length, file size).
- [ ] **E13-4** (AP, ZR) Living admin documentation (custom blocks, forms, tracking).

## E14 — Launch & aftercare
- [ ] **E14-1** (AP) Pre-launch checklist: redirects, SEO continuity, tracking, forms.
- [ ] **E14-2** (AP) DNS cutover to DO live; smoke test.
- [ ] **E14-3** (J) Launch-day QA sweep (redirects + forms on live).
- [ ] **E14-4** (RB) Go/no-go sign-off + client launch comms.
- [ ] **E14-5** (AP, J) 30-day bug-fix window (through early Sept); weekly bug reporting.

---

## Notes / to refine
- Volumes per page/block tier are **estimates until E0-1 runs** — don't commit client hours before then.
- E3 T3 blocks + E7-1 calendar are the heaviest engineering; they double as the CPT list blocks (E5).
- Deep-dives still worth doing per content type (Staff/Courses/Blogs/Calendar/Livestream) like the Pages
  one — fields above are from the migrations, not yet a full code review.
