Source of Truth for Status:
roadmap_controller.rbPhase status (complete/in-progress/not-started) is maintained in the roadmap controller. Spec files in this folder contain requirements and details only.
| Phase | Title | Description | Spec |
|---|---|---|---|
| 1 | Foundations | ✅ Authentication, Profiles, Directory, Communities, Messaging, Events, News | phase-1/ |
| 2 | Community Leadership | ✅ Community Leader (CL) role, Admin UI, CL portal features, Moderation | phase-2/ |
| 3 | Discussion Boards | ✅ Per-community boards + national board, moderation tools | phase-3/ |
| 4 | Mobile-First Interface Cleanup | ✅ UI/UX polish, mobile optimization, image variant audit | phase-4/ |
| 5 | Pre-MVP Updates | ✅ Non-alumni members, Friending, Alumni Matching, Photo Albums | phase-5/ |
| 6 | Reporting & Insights | ✅ Activity metrics & CSV exports delivered (6.1); community health (6.2) and PDF reports (6.3) moved to Backlog | phase-6/ |
| 7 | Career Center | ✅ Self-serve career hub with resources, OCPD partnership, career events | phase-7/ |
| 8 | Notifications & Digests | ✅ In-app notifications, email digests, preference management | phase-8/ |
| 9 | Onboarding & Initial UX | ✅ Complete (9.6 onboarding email drip deferred to Backlog) | phase-9/ |
| 10 | Connections | ✅ Connection request system, replaces Messaging + Contacts | phase-10/ |
| 11 | Champion Role Dashboard Card | ✅ Daily role-aligned idea packs, roles landing page, admin CRUD | phase-11/ |
| 12 | Source-Alignment Review | ✅ Audit of user-facing text against 20 canonical source documents | phase-12/ |
| 13 | Progressive Dashboard & Engagement Tiers | ✅ Journey engine, tier detection, activity feed, nudge engine, milestone celebrations | phase-13/ |
| 14 | Alumni Content Submissions | ✅ Champion news/event submissions, admin review queue, notifications, attribution | phase-14/ |
| 15 | Design Consistency Pass | ✅ Border radius, card headers, typography, gradient cleanup complete | phase-15/ |
| 16 | Legal & IT Compliance | ✅ Policy pages, consent flow, education privacy, account deletion, CAN-SPAM, security headers | phase-16/ |
| 17 | Champions Landing & Legacy Cleanup | ✅ Public /champions landing, generic landing refresh, legacy signup retirement, data catalog | phase-17/ |
| 18 | Education Data Model Migration | ✅ Alumni -> Education -> EducationAreaOfStudy with backward-compatible API rollout | phase-18/ |
| 19 | Alumni Champions Signup v2.0 | ⏳ In progress: rebuilt public signup flow, profile hub, returning-visitor access | phase-19/ |
| 20 | Feature Flags & Phased Launch | ✅ Flag foundation, admin UI, gated content and role features | phase-20/ |
| 21 | Alumni Opportunities | ✅ Public opportunity forms, CMS, staff queue, profile-hub integration | phase-21/ |
| 22 | Staff Notification Inbox & Signup CRM Feedback Loop | ✅ Complete: inbox at /notifications, bell rebuilt into New + Pending work, and signup-reported contact/employment/student-group updates now reach Advancement Services via CrmDataChange |
phase-22/ |
| 23 | Namespace & Naming Unwind | ✅ Complete. 23.1 surface-boundary architecture test (a ratchet) + shared Industry; 23.2 public/ → signup/, champion_signups/ → signup_admin/, alum-facing URLs unchanged, legacy staff paths 301’d; 23.3 shared layer (the walls need doors) + dev-process extraction; 23.4 champions/ → alumni_network/, 185 files, resources :members, permanent wildcard 301s for persisted notification URLs; 23.6 docs reconciliation. Two sub-phases cut against measured churn: the lookup/ namespace (~927 refs, zero misroutes prevented — Lookup is defined by exclusion instead) and all of 23.5 (Cp:: → An::, 389 files, the phase’s only migration). Cp:: is permanent |
phase-23/ |
| 24 | Alumni Employment Data | ✅ Complete: schema, CRM importer, import UI, profile card, employer search + export. Ran before 22 and 23 — see phase-24 §2 | phase-24/ |
| 25 | Signup Data in the Lookup Portal | ✅ Complete: Alumni::SignupProfile read layer, effective location, interest leaning replaces Champion Role, dual-source affinities, CSV columns, filter cleanup |
phase-25/ |
| 26 | Identity Resolution & Write Direction | 📝 Drafted, not started. One BUID can be described by alumni, cp_champions, and N champion_signups at once, and the repo holds two contradictory write policies for the same fields. Also: Cp::SyncChampionToAlumni is fully tested and never called, so portal edits never reach the CRM export pipeline. Blocked on the portal unfreezing — but Decisions A–D and Alumni::Identity can proceed first |
phase-26/ |
| 27 | Returning Alum Identity | ✅ Complete — eight sub-phases, August 5–12, 2026. Phase 19 built a signup flow that could only be entered once; this gave a returning alum a way back in. 27.1 duplicate prevention, 27.2 the /sign-in front door + rack_attack limits, 27.3/27.6 remembered devices and their disclosure, 27.4 the opportunity flow for someone already known, 27.5 hub additions, 27.8 one front door. Read 27.7 alongside §4 rather than §4 alone — it reverses Decision B and collapses two signed-in states into one. 27.8 was written against the shipped flow rather than the spec, and audits the sub-phase boundaries themselves; its §7 is the finding worth carrying forward |
phase-27/ |
| 28 | Google Sign-In and One Row Per Person | ✅ Complete — three sub-phases, August 14, 2026. 27’s way back in cost a round trip through email every time; Google collapses it to two clicks, but a verified credential has to resolve to exactly one record and champion_signups had no unique index on email. So 28.1 uniqueness lands first (partial index on LOWER(email) WHERE deleted_at IS NULL) and the newest-row-wins tie-breaker is retired rather than hardened — BUID becomes the only merge key. 28.2 one callback, a four-way resolver, and email_verified as a hard gate; Google never CREATES a signup — it matches one or hands the person to the form with verified details prefilled. 28.3 step 1 shortens to identity-only, which also repaired a live defect: ZIP alone had been returning status 5 (“Completed”) since ~November 2025 |
phase-28/ |
| 29 | Giving Import | ✅ Complete — September 23, 2026. Two deploys (§11): the salesforce_contact_id column and its contact-importer mapping first, then the importer, which is meaningless before that column is backfilled. One uploaded gift report replaces a case-sensitive VLOOKUP, a pivot, a hand-built level column and a manual fiscal-year delete. Joins on a new alumni.salesforce_contact_id (15-char, never case-folded — 003Uq00000QBvQK and 003Uq00000QbvQK are two people). The design question was step 6: a report that does not reach back to June 1 must not replace a fiscal year, and a file cannot tell you its own window — so the window is an input and only provably-covered fiscal years are replaced. No dollar amounts are stored, which is also why raise-only merge is refused rather than deferred |
phase-29/ |
| 30 | Unified CRM Imports | ✅ Complete — September 24, 2026. Contacts, Educations, Areas of Study and Employment run one flow at /settings/imports/:type: one status-driven batch page, one poller, one controller, an ImportBatch concern and an Imports::Type registry. Every type gets a Commit confirm, a working Cancel, drag-and-drop upload, streamed manifests and heartbeat stale detection. Fixed the scan page that needed a manual refresh (batches created pending; Contacts’ inline-script pollers). 30.3 deleted the legacy Alumni CSV, Degrees CSV, Banner and /people importers |
phase-30/ |
| 31 | International Addresses | ✅ Complete — October 6, 2026. “Not living in the U.S.?” on the signup and opportunity forms swaps the ZIP for Country + City (+ optional postal code). zip_code stays U.S.-only by schema (a forced-in Berlin postcode had resolved to New York); country/postal_code are new columns, and international alumni land in six continent districts. One location_complete? rule drives status, the hub banner and validation. Also fixed a 28.3 regression: converting an opportunity response lost its phone and ZIP |
phase-31/ |
All 17 beta-defining phases are complete. The platform is ready for Beta launch.
Post-beta roadmap extension:
Deferred to Backlog (not blocking launch):
| Feature | Description | Priority |
|---|---|---|
| Job Board | Career resources, job postings with skills matching | Medium |
| Alumni Business Directory | Searchable directory of alumni-owned businesses | Medium |
| Newsletter Tool | Admin tool with hard-coded + community content sections | Low |
| Real-Time Messaging | Action Cable/WebSocket live updates | Low |
| Map View | Geographic visualization of Champions | Low |
| Advanced Search | Enhanced filtering and search capabilities | Low |
See BACKLOG.md for complete details on deferred features.
| Term | Definition |
|---|---|
| Community | A group Champions can join: district (city), college, major, affinity, industry, or custom |
| CL | Community Leader (singular) — a Champion with moderation/leadership role for a community |
| Community Leaders | Plural form for a community’s leadership team |
| CLC | Community Leadership Council — collective body of all Community Leaders across all communities |
Items that were absorbed into other phases or superseded:
| File | Original | Disposition |
|---|---|---|
| 1A-quick-connect.md | Phase 1A | Absorbed into Phase 1.7 (in-app messaging) |
| 1B-enhancements.md | Phase 1B | Absorbed into Phase 1.6 |
| 1C-role-selection.md | Phase 1C | Complete — now standard Phase 1 feature |
phase-6-reporting.md (file no longer present) |
Phase 6 | Moved to Feature Backlog. Row kept as a record of the disposition; the link was dead, so it has been unlinked rather than left navigable |
phases/
README.md # This file (index)
phase-N/
README.md # Main phase spec
X.Y-feature.md # Sub-phase specs (as needed)
archive/ # Completed sub-phases (future)
archive/ # Absorbed/superseded phases
| Change | Update Location |
|---|---|
| Phase status changes | roadmap_controller.rb only |
| New sub-phase added | Create phase-N/X.Y-feature.md + add to roadmap_controller.rb |
| Feature requirements change | Edit spec file only |
| Phase absorbed/superseded | Move to archive/ + update this index |
See AGENTS.md for phase numbering convention.