Skip to content

docs(migration): document individual memberships and email forwarder#698

Merged
dealako merged 10 commits into
mainfrom
feature/LFXV2-1664-migration-docs
May 15, 2026
Merged

docs(migration): document individual memberships and email forwarder#698
dealako merged 10 commits into
mainfrom
feature/LFXV2-1664-migration-docs

Conversation

@dealako
Copy link
Copy Markdown
Contributor

@dealako dealako commented May 13, 2026

Summary

Add current-state and migration write-ups for two flows being migrated from myprofile + membership-ui into LFX Self Serve:

  • Individual Memberships ($99/yr TLF Supporter): cross-app user journey, Stripe + Salesforce wiring, and gap analysis vs LFX Self Serve.
  • Linux.com Email Forwarder ($150 lifetime alias): purchase + claim flow spanning myprofile, membership-ui, and the ITX mail-forwarder service, with UX unification is the primary migration win.

Added a Migration section to the mkdocs nav.

Changes

 .markdownlint.json                          |  21 +-
 docs/migration/individual-memberships.md    | 631 ++++++++++++++++++++++++++++
 docs/migration/linux-com-email-forwarder.md | 475 +++++++++++++++++++++
 mkdocs.yaml                                 |   3 +
 4 files changed, 1125 insertions(+), 5 deletions(-)

Jira: LFXV2-1664

Copilot AI review requested due to automatic review settings May 13, 2026 01:40
@dealako dealako requested a review from a team as a code owner May 13, 2026 01:40
@dealako dealako added the ai-assisted A task or activity that was supported by AI, such as CoPilot, ChatGPT, or other AI technology. label May 13, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 13, 2026

Review Change Stack

Walkthrough

Adds two migration guides (Individual Memberships, Linux.com Email Forwarder), reformats .markdownlint.json rule entries (expanding MD003, MD007, MD024 into multi-line objects while keeping MD013=false), and updates mkdocs.yaml to add a top-level "Migration" navigation section.

Changes

Migration Documentation and Configuration

Layer / File(s) Summary
Markdown linting rule updates
.markdownlint.json
Rewrote selected markdownlint rule entries into explicit multi-line JSON objects (MD003, MD007, MD024); MD013 remains explicitly disabled (false).
Individual Memberships migration guide
docs/migration/individual-memberships.md
Complete guide for Individual Memberships: myprofile entry points and handoff, membership-ui wizard and Stripe checkout, member-service + Salesforce enrollment path, architecture diagrams, component/endpoint inventories, enrollment status derivation, config/env details, failure modes, migration notes, and appendices with example payloads.
Linux.com Email Forwarder migration guide
docs/migration/linux-com-email-forwarder.md
Guide for the Linux.com Email Forwarder lifetime add-on: add-on modeling (EndDate=2099), purchase gating and alias claim/edit/rename flows (sequence diagram), myprofile/membership-ui entry points, GET/POST /enrollment/alias behaviors, cross-service state derivation (member-service, user-service, ITX), non-atomic rename behavior, config details, failure modes, and LFX One migration notes with appendix.
Documentation navigation
mkdocs.yaml
Added a top-level "Migration" navigation group linking the two new migration pages.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and clearly summarizes the main changeset: adding migration documentation for individual memberships and email forwarder flows.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The pull request description is directly related to the changeset, clearly describing the addition of migration documentation for two features and updates to configuration files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/LFXV2-1664-migration-docs

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds migration documentation for two legacy membership-related user journeys (Individual Supporter membership and Linux.com email forwarder add-on) and updates the documentation toolchain/navigation to support these new docs in LFX Self Serve.

Changes:

  • Added two detailed migration/current-state write-ups under docs/migration/.
  • Updated MkDocs navigation to include a new “Migration” section.
  • Adjusted markdownlint configuration (MD013 to 120 chars with code/table exemptions; disabled MD060).

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

File Description
.markdownlint.json Updates Markdown linting rules/limits to better accommodate long-form migration docs.
mkdocs.yaml Adds a “Migration” nav section pointing to the new docs.
docs/migration/individual-memberships.md New documentation describing the current Individual Supporter membership flow and migration considerations.
docs/migration/linux-com-email-forwarder.md New documentation describing the current Linux.com email forwarder add-on flow and migration considerations.
Comments suppressed due to low confidence (1)

docs/migration/individual-memberships.md:440

  • Typo in the function name: Notifiy... should be spelled Notify... for readability/searchability (even in docs).
1. `NotifiyMembershipServiceError()` auto-files a **Jira ticket** and sends an SES email
   with subject "URGENT: Individual Enrollment" to support (`backend/modules/enrollment/index.js:416–456`).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/migration/linux-com-email-forwarder.md
Comment thread docs/migration/individual-memberships.md
Comment thread docs/migration/linux-com-email-forwarder.md
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
docs/migration/linux-com-email-forwarder.md (1)

246-256: 🏗️ Heavy lift

Non-atomic rename operation is a significant operational risk.

The documentation correctly identifies that the alias rename is a four-step sequence with no rollback or transaction boundaries (lines 248-256). If steps 3 or 4 fail, the user loses their old alias without getting the new one. This is an excellent opportunity for improvement in the migration to LFX One—consider wrapping this in a saga pattern or compensating transaction to ensure atomicity.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/migration/linux-com-email-forwarder.md` around lines 246 - 256, The
UpdateForwardAlias flow (enrollment.service.ts: UpdateForwardAlias) performs a
non-atomic 4-step rename using userService.UpdateUserEmails and
itxService.DeleteForward/CreateForward which can leave users without an alias if
steps 3 or 4 fail; fix by making the operation compensatable or atomic:
implement a saga/compensating transaction around UpdateForwardAlias that either
(a) creates the new ITX forward (itxService.CreateForward(newAlias, recipient))
and adds the new alias to the user (userService.UpdateUserEmails(token, add new
alias)) before removing the old forward and old alias, or (b) on any failure run
compensating steps to recreate the old forward and re-add the old alias (use
itxService.CreateForward with the oldAlias and
userService.UpdateUserEmails(token, add old alias)), add retry/backoff and
clear, well-scoped logging for each step, and surface errors so callers can
coordinate retries; update UpdateForwardAlias to orchestrate these compensations
and unit tests to cover failure points.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/migration/linux-com-email-forwarder.md`:
- Around line 322-333: The docs note that member-service, ITX, and user-service
are independent and not automatically kept in sync, which is an operational
risk; update the migration plan to define a concrete consistency solution: add a
reconciliation job (e.g., a periodic reconciler service) that compares
member-service records for productID = 01t2M000005wBazQAE against ITX
alias/forward-to and user-service email lists and repairs or alerts on
mismatches, and/or define a saga/orchestration flow for purchase/alias changes
with compensating actions and robust error handling and logging; include clear
instructions in the document on how to run the reconciler, expected invariants,
and where to find logs/alerts.

---

Nitpick comments:
In `@docs/migration/linux-com-email-forwarder.md`:
- Around line 246-256: The UpdateForwardAlias flow (enrollment.service.ts:
UpdateForwardAlias) performs a non-atomic 4-step rename using
userService.UpdateUserEmails and itxService.DeleteForward/CreateForward which
can leave users without an alias if steps 3 or 4 fail; fix by making the
operation compensatable or atomic: implement a saga/compensating transaction
around UpdateForwardAlias that either (a) creates the new ITX forward
(itxService.CreateForward(newAlias, recipient)) and adds the new alias to the
user (userService.UpdateUserEmails(token, add new alias)) before removing the
old forward and old alias, or (b) on any failure run compensating steps to
recreate the old forward and re-add the old alias (use itxService.CreateForward
with the oldAlias and userService.UpdateUserEmails(token, add old alias)), add
retry/backoff and clear, well-scoped logging for each step, and surface errors
so callers can coordinate retries; update UpdateForwardAlias to orchestrate
these compensations and unit tests to cover failure points.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 115b792b-b15d-43d1-9409-4ee4961693d2

📥 Commits

Reviewing files that changed from the base of the PR and between 8f616cb and 21d3ccb.

📒 Files selected for processing (4)
  • .markdownlint.json
  • docs/migration/individual-memberships.md
  • docs/migration/linux-com-email-forwarder.md
  • mkdocs.yaml

Comment thread docs/migration/linux-com-email-forwarder.md
niravpatel27
niravpatel27 previously approved these changes May 13, 2026
@dealako dealako requested a review from MRashad26 May 13, 2026 05:56
Add current-state and migration write-ups for two flows being migrated
from myprofile + membership-ui into LFX Self Serve:

- Individual Memberships ($99/yr TLF Supporter): cross-app user journey,
  Stripe + Salesforce wiring, and gap analysis vs LFX Self Serve.
- Linux.com Email Forwarder ($150 lifetime alias): purchase + claim flow
  spanning myprofile, membership-ui, and the ITX mail-forwarder service,
  with UX unification as the primary migration win.

Also adjusted markdownlint to disable MD060, and add a Migration section to the
mkdocs nav.

Jira: https://jira.linuxfoundation.org/browse/LFXV2-1664

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: David Deal <ddeal@linuxfoundation.org>
@dealako dealako force-pushed the feature/LFXV2-1664-migration-docs branch from 21d3ccb to 3885fe4 Compare May 13, 2026 14:45
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 13, 2026

Review Change Stack

Caution

Review failed

An error occurred during the review process. Please try again later.

Walkthrough

This PR adds two comprehensive migration documentation pages describing the current Individual Memberships and Linux.com Email Forwarder implementations with strategy and gaps for LFX One migration. It also updates markdownlint rules to enforce consistent line length and extends mkdocs navigation to surface the new Migration section.

Changes

Migration Documentation and Configuration

Layer / File(s) Summary
Markdown linting rule updates
.markdownlint.json
MD013 (line length) is enabled with 120-character limit excluding code blocks and tables; MD060 is explicitly disabled; several rules are reformatted into explicit multi-line objects.
Individual Memberships migration guide
docs/migration/individual-memberships.md
End-to-end documentation of current Individual Memberships flow spanning myprofile entry points, membership-ui wizard, Stripe checkout, and member-service enrollment. Includes architecture diagrams, component/endpoint inventories, enrollment status derivation rules, configuration details, operational failure modes, migration patterns for LFX One, and API payload examples.
Linux.com Email Forwarder migration guide
docs/migration/linux-com-email-forwarder.md
End-to-end documentation of current Linux.com Email Forwarder lifetime add-on covering purchase gating and alias management workflows across myprofile, membership-ui, and backend services (member-service, user-service, ITX). Includes architecture diagrams, component/endpoint inventories, membership-ui gating behavior, data-model derivation explaining independent sources of purchase and alias state, failure modes, and LFX One migration scope and open questions.
Documentation navigation
mkdocs.yaml
New "Migration" section added to top-level navigation with links to Individual Memberships and Linux.com Email Forwarder migration guides.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding documentation for individual memberships and email forwarder migration flows.
Description check ✅ Passed The description clearly explains the purpose of the changes, detailing the two migration flows, configuration adjustments, and navigation updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/LFXV2-1664-migration-docs

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@asithade asithade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the migration write-ups — these are detailed and clearly the result of careful walkthroughs of the legacy code. Two things to address before merge:

  1. NotifiyMembershipServiceError typo persists at three locations across both docs (flagged earlier by Copilot but not yet fixed). Worth correcting so the docs stay grep-friendly against the real Notify… symbol in the legacy codebase.
  2. PR description ↔ .markdownlint.json mismatch: the description still says MD013 is relaxed to 120 chars (code/tables exempt), but the committed file disables MD013 entirely ("MD013": false). Please align them — either restore MD013 with {"line_length": 120, "code_blocks": false, "tables": false}, or update the PR description (and squash-merge body) to say MD013 is disabled.

Minor nits (not blocking):

  • Branch name feature/LFXV2-1664-migration-docscommit-workflow.md calls for <type>/LFXV2-<n> where <type> is a valid commit type (e.g. docs/LFXV2-1664).
  • PR size is 1120 lines, just over the 1000-line target — fine here since splitting two tightly related migration docs would just create churn.

CodeRabbit's content suggestions about saga/reconciliation patterns describe how the legacy system could be improved in LFX One — out of scope for a current-state migration write-up. The docs correctly describe what exists today; those notes belong in future LFX One implementation tickets, not in these documents.

Comment thread docs/migration/individual-memberships.md
Comment thread docs/migration/individual-memberships.md
Comment thread docs/migration/linux-com-email-forwarder.md
Expand the 'Consistent state' row in the What needs to be built table
to name all three services that can drift (member-service, ITX,
user-service) and enumerate the three migration strategies: accept
eventual consistency, saga with compensating actions, or periodic
reconciler. Defers the design decision to the migration project.

Refs: LFXV2-1664

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: David Deal <ddeal@linuxfoundation.org>
Copilot AI review requested due to automatic review settings May 13, 2026 20:32
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

@dealako dealako requested a review from asithade May 13, 2026 20:34
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/migration/linux-com-email-forwarder.md`:
- Line 1: The file contains formatting issues flagged by Prettier (e.g., the
HTML comment <!-- Copyright The Linux Foundation and each contributor to LFX.
-->); run the project's Prettier formatter (prettier --write) against this file
using the repo's Prettier config, stage and commit the resulting changes so CI's
code-style/prettier check passes. Ensure you don't alter content other than
formatting and include the formatted file in the PR update.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e5e8200e-0b39-493a-814a-6b96fd5538cf

📥 Commits

Reviewing files that changed from the base of the PR and between 21d3ccb and 69253f6.

📒 Files selected for processing (4)
  • .markdownlint.json
  • docs/migration/individual-memberships.md
  • docs/migration/linux-com-email-forwarder.md
  • mkdocs.yaml
✅ Files skipped from review due to trivial changes (1)
  • mkdocs.yaml

Comment thread docs/migration/linux-com-email-forwarder.md
dealako added 2 commits May 13, 2026 15:46
Signed-off-by: David Deal <ddeal@linuxfoundation.org>
Copilot AI review requested due to automatic review settings May 13, 2026 22:48
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
docs/migration/linux-com-email-forwarder.md (1)

111-111: 💤 Low value

Minor grammar polish in diagram note.

The phrase "Old removed, new created" could be slightly more grammatical as "Old removed, new forward created" or "Old forward removed, new one created" for clarity.

✏️ Suggested polish
-    ITX-->>MPB: Old removed, new created
+    ITX-->>MPB: Old forward removed, new forward created
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/migration/linux-com-email-forwarder.md` at line 111, Update the diagram
note text "ITX-->>MPB: Old removed, new created" to be more grammatical and
clear by replacing it with a revised phrase such as "ITX-->>MPB: Old forward
removed, new one created" (or "Old forward removed, new forward created") so the
intent is explicit; modify the string literal in the diagram definition where
"ITX-->>MPB: Old removed, new created" appears to the chosen polished wording.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@docs/migration/linux-com-email-forwarder.md`:
- Line 111: Update the diagram note text "ITX-->>MPB: Old removed, new created"
to be more grammatical and clear by replacing it with a revised phrase such as
"ITX-->>MPB: Old forward removed, new one created" (or "Old forward removed, new
forward created") so the intent is explicit; modify the string literal in the
diagram definition where "ITX-->>MPB: Old removed, new created" appears to the
chosen polished wording.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f4c1227e-4316-480b-9cbb-7eb76f8f140d

📥 Commits

Reviewing files that changed from the base of the PR and between 69253f6 and b0ed816.

📒 Files selected for processing (1)
  • docs/migration/linux-com-email-forwarder.md

Copy link
Copy Markdown
Contributor

@asithade asithade left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docs are well-structured, mermaid diagrams render cleanly, the "What needs to be built" tables are useful for the migration team, and the 3-way consistency strategy enumeration (in response to CodeRabbit) is a nice clarification.

The one substantive concern is the MD060: false addition. It's effectively dead code in CI (the action's markdownlint version predates MD060), the underlying table issue was already fixed by Prettier's auto-alignment, and the PR body doesn't justify the repo-wide policy change. Recommend removing it and keeping the Prettier-aligned tables. If the team genuinely wants to opt out of table-column-style enforcement, please document the rationale.

Also flagging that the docs reference specific upstream file paths and line numbers without pinning them to commits in the source-of-truth repos — those references will rot quickly. A short upstream-refs section in the PR body would future-proof the docs.

Note: 1120 additions exceeds the 1000-line target in commit-workflow.md, but for a docs-only PR with two self-contained write-ups this is acceptable.


Additional context (top-level finding, no file):

Link upstream source-of-truth commits in the PR description. The migration docs reference dozens of specific file paths and line numbers in myprofile and membership-ui (e.g. frontend/src/router/index.js:20–23, backend/src/modules/enrollment/enrollment.service.ts). Per commit-workflow.md's "External repo references" guidance, the PR body should link to the corresponding upstream commits so the facts are pinned to a known state — those repos will keep moving after this doc lands, and line numbers will drift. A short list at the bottom of the description ("Captured from myprofile@, membership-ui@") is enough.

Comment thread .markdownlint.json Outdated
Comment thread .markdownlint.json
Copilot AI review requested due to automatic review settings May 14, 2026 16:33
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

The actual table issue was already fixed by Prettier. Commit b0ed816 ("fixed
lint issue") padded linux-com-email-forwarder.md table rows to consistent
widths — that's Prettier's markdown table behavior, not markdownlint.

Signed-off-by: David Deal <ddeal@linuxfoundation.org>
@dealako
Copy link
Copy Markdown
Contributor Author

dealako commented May 14, 2026

Lastest commit adjusts the .markdown.json config discrepancy. See the commit message for the details.

@dealako dealako requested a review from asithade May 14, 2026 19:40
Copilot AI review requested due to automatic review settings May 15, 2026 14:34
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

@dealako dealako merged commit 94391e7 into main May 15, 2026
16 checks passed
@dealako dealako deleted the feature/LFXV2-1664-migration-docs branch May 15, 2026 16:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-assisted A task or activity that was supported by AI, such as CoPilot, ChatGPT, or other AI technology.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants