diff --git a/Gemfile b/Gemfile
index e886ddb8b..f9b3fe818 100644
--- a/Gemfile
+++ b/Gemfile
@@ -113,6 +113,7 @@ group :test do
gem 'rubocop-rspec_rails'
# RSpec for unit testing
gem 'rspec'
+ gem 'rspec-rebound'
# RSpec Rails integration
gem 'rspec-rails'
# Selenium WebDriver for browser automation
diff --git a/Gemfile.lock b/Gemfile.lock
index 3ffb09ed8..ae1a0f239 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -642,6 +642,8 @@ GEM
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
+ rspec-rebound (0.2.1)
+ rspec-core (~> 3.3)
rspec-support (3.13.4)
rswag (2.16.0)
rswag-api (= 2.16.0)
@@ -851,6 +853,7 @@ DEPENDENCIES
redis (~> 5.4)
rspec
rspec-rails
+ rspec-rebound
rswag
rubocop
rubocop-capybara
diff --git a/app/controllers/better_together/settings_controller.rb b/app/controllers/better_together/settings_controller.rb
new file mode 100644
index 000000000..c7f5e4d17
--- /dev/null
+++ b/app/controllers/better_together/settings_controller.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+module BetterTogether
+ class SettingsController < ApplicationController
+ end
+end
diff --git a/app/controllers/better_together/users/registrations_controller.rb b/app/controllers/better_together/users/registrations_controller.rb
index 70600bcdc..e93f4d637 100644
--- a/app/controllers/better_together/users/registrations_controller.rb
+++ b/app/controllers/better_together/users/registrations_controller.rb
@@ -3,11 +3,62 @@
module BetterTogether
module Users
# Override default Devise registrations controller
- class RegistrationsController < ::Devise::RegistrationsController
+ class RegistrationsController < ::Devise::RegistrationsController # rubocop:todo Metrics/ClassLength
include DeviseLocales
skip_before_action :check_platform_privacy
before_action :set_required_agreements, only: %i[new create]
+ before_action :configure_account_update_params, only: [:update]
+
+ # PUT /resource
+ # We need to use a copy of the resource because we don't want to change
+ # the current user in place.
+ def update # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
+ self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
+ prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
+
+ resource_updated = update_resource(resource, account_update_params)
+ yield resource if block_given?
+ if resource_updated
+ set_flash_message_for_update(resource, prev_unconfirmed_email)
+ bypass_sign_in resource, scope: resource_name if sign_in_after_change_password?
+
+ respond_to do |format|
+ format.html { respond_with resource, location: after_update_path_for(resource) }
+ format.turbo_stream do
+ flash.now[:notice] = I18n.t('devise.registrations.updated')
+ render turbo_stream: [
+ turbo_stream.replace(
+ 'flash_messages',
+ partial: 'layouts/better_together/flash_messages',
+ locals: { flash: }
+ ),
+ turbo_stream.replace(
+ 'account-settings',
+ partial: 'devise/registrations/edit_form'
+ )
+ ]
+ end
+ end
+ else
+ clean_up_passwords resource
+ set_minimum_password_length
+
+ respond_to do |format|
+ format.html { respond_with resource, location: after_update_path_for(resource) }
+ format.turbo_stream do
+ render turbo_stream: [
+ turbo_stream.replace('form_errors', partial: 'layouts/better_together/errors',
+ locals: { object: resource }),
+ turbo_stream.replace(
+ 'account-settings',
+ partial: 'devise/registrations/edit_form'
+ )
+ ]
+ end
+ end
+ end
+ end
def new
super do |user|
@@ -62,6 +113,15 @@ def create # rubocop:todo Metrics/MethodLength, Metrics/AbcSize
protected
+ def account_update_params
+ devise_parameter_sanitizer.sanitize(:account_update)
+ end
+
+ def configure_account_update_params
+ devise_parameter_sanitizer.permit(:account_update,
+ keys: %i[email password password_confirmation current_password])
+ end
+
def set_required_agreements
@privacy_policy_agreement = BetterTogether::Agreement.find_by(identifier: 'privacy_policy')
@terms_of_service_agreement = BetterTogether::Agreement.find_by(identifier: 'terms_of_service')
@@ -84,6 +144,10 @@ def after_inactive_sign_up_path_for(resource)
super
end
+ def after_update_path_for(_resource)
+ better_together.edit_user_registration_path
+ end
+
def person_params
params.require(:user).require(:person_attributes).permit(%i[identifier name description])
end
diff --git a/app/policies/better_together/user_policy.rb b/app/policies/better_together/user_policy.rb
index 11c31508a..c576f9753 100644
--- a/app/policies/better_together/user_policy.rb
+++ b/app/policies/better_together/user_policy.rb
@@ -3,11 +3,11 @@
module BetterTogether
class UserPolicy < ApplicationPolicy # rubocop:todo Style/Documentation
def index?
- user.present?
+ permitted_to?('manage_platform')
end
def show?
- user.present?
+ user.present? && (record == user || permitted_to?('manage_platform'))
end
def create?
@@ -19,7 +19,7 @@ def new?
end
def update?
- false
+ permitted_to?('manage_platform')
end
def edit?
@@ -36,7 +36,9 @@ def me?
class Scope < Scope # rubocop:todo Style/Documentation
def resolve
- scope.all
+ return scope.where(id: user.id) unless permitted_to?('manage_platform')
+
+ scope.order(created_at: :desc)
end
end
end
diff --git a/app/views/better_together/people/_form.html.erb b/app/views/better_together/people/_form.html.erb
index b8000d4ed..434ec9eef 100644
--- a/app/views/better_together/people/_form.html.erb
+++ b/app/views/better_together/people/_form.html.erb
@@ -41,21 +41,15 @@
- <%= required_label(form, :name, class: "form-label") %>
- <%= render partial: 'better_together/shared/translated_string_field', locals: { model: person, form: form, attribute: 'name' } %>
- <%= t('helpers.hint.person.name') %>
+ <%= render partial: 'better_together/shared/translated_string_field', locals: { model: person, form: form, attribute: 'name' } %>
- <%= form.label :description, class: "form-label" %>
- <%= render partial: 'better_together/shared/translated_rich_text_field', locals: { model: person, form: form, attribute: 'description_html' } %>
- <%= t('helpers.hint.person.description') %>
+ <%= render partial: 'better_together/shared/translated_rich_text_field', locals: { model: person, form: form, attribute: 'description_html' } %>
- <%= form.label :slug, class: "form-label" %>
- <%= render partial: 'better_together/shared/translated_string_field', locals: { model: person, form: form, attribute: 'slug' } %>
- <%= t('helpers.hint.person.slug') %>
+ <%= render partial: 'better_together/shared/translated_string_field', locals: { model: person, form: form, attribute: 'slug' } %>
diff --git a/app/views/better_together/settings/index.html.erb b/app/views/better_together/settings/index.html.erb
new file mode 100644
index 000000000..6cb31febb
--- /dev/null
+++ b/app/views/better_together/settings/index.html.erb
@@ -0,0 +1,124 @@
+
+<% content_for :page_title, t('.title') %>
+
+
+
<%= I18n.t(
"errors.messages.not_saved",
diff --git a/app/views/layouts/better_together/_flash_messages.html.erb b/app/views/layouts/better_together/_flash_messages.html.erb
index 0630e5ba2..ab379d99a 100644
--- a/app/views/layouts/better_together/_flash_messages.html.erb
+++ b/app/views/layouts/better_together/_flash_messages.html.erb
@@ -7,6 +7,7 @@
<% flash.each do |type, message| %>
<% alert_class = case type
when 'notice' then 'alert-success'
+ when 'success' then 'alert-success'
when 'alert' then 'alert-warning'
when 'error' then 'alert-danger'
when 'info' then 'alert-info'
diff --git a/app/views/layouts/better_together/_user_nav.html.erb b/app/views/layouts/better_together/_user_nav.html.erb
index c7fff7f7d..f56c3a371 100644
--- a/app/views/layouts/better_together/_user_nav.html.erb
+++ b/app/views/layouts/better_together/_user_nav.html.erb
@@ -21,6 +21,12 @@
<%= link_to t('navbar.my_profile'), person_my_profile_path(person_id: current_person.slug), class: "my-profile dropdown-item ", data: { identifier: 'my-profile' } %>
<%= link_to t('navbar.conversations'), conversations_path, class: "dropdown-item", data: { identifier: 'conversations' } %>
+
+ <%= link_to settings_path, class: "dropdown-item", data: { identifier: 'settings' } do %>
+
+ <%= t('navbar.settings') %>
+ <% end %>
+
<%= link_to host_community.name, host_community, class: "host-community dropdown-item ", data: { identifier: 'host-community' } %>
diff --git a/bin/render_diagrams b/bin/render_diagrams
index 496ed2541..78748f925 100755
--- a/bin/render_diagrams
+++ b/bin/render_diagrams
@@ -2,22 +2,27 @@
set -euo pipefail
FORCE=${FORCE:-0}
+SPECIFIED_FILES=()
usage() {
cat <&2
- usage >&2
- exit 2
+ # Check if it's a file without .mmd extension
+ if [ -f "docs/diagrams/source/$1.mmd" ]; then
+ SPECIFIED_FILES+=("$1.mmd")
+ elif [ -f "docs/diagrams/source/$1" ]; then
+ SPECIFIED_FILES+=("$1")
+ else
+ echo "Error: File not found: $1" >&2
+ echo "Looking for: docs/diagrams/source/$1 or docs/diagrams/source/$1.mmd" >&2
+ exit 2
+ fi
;;
esac
shift
@@ -118,10 +140,39 @@ detect_complexity() {
}
shopt -s nullglob
-files=(docs/diagrams/source/*.mmd)
+
+# Determine which files to process
+if [ ${#SPECIFIED_FILES[@]} -gt 0 ]; then
+ # Process specified files
+ files=()
+ for spec_file in "${SPECIFIED_FILES[@]}"; do
+ if [[ "$spec_file" == /* ]]; then
+ # Absolute path provided
+ full_path="$spec_file"
+ else
+ # Relative path, assume it's in docs/diagrams/source/
+ full_path="docs/diagrams/source/$spec_file"
+ fi
+
+ if [ -f "$full_path" ]; then
+ files+=("$full_path")
+ else
+ echo "Error: File not found: $full_path" >&2
+ exit 2
+ fi
+ done
+else
+ # Process all .mmd files (original behavior)
+ files=(docs/diagrams/source/*.mmd)
+fi
+
if [ ${#files[@]} -eq 0 ]; then
- echo "No Mermaid files found in docs/diagrams/source/*.mmd" >&2
- echo "Please ensure Mermaid diagram source files are in docs/diagrams/source/" >&2
+ if [ ${#SPECIFIED_FILES[@]} -gt 0 ]; then
+ echo "No valid Mermaid files found from specified arguments" >&2
+ else
+ echo "No Mermaid files found in docs/diagrams/source/*.mmd" >&2
+ echo "Please ensure Mermaid diagram source files are in docs/diagrams/source/" >&2
+ fi
exit 0
fi
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 68fb1d79a..31117e0d1 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1257,6 +1257,31 @@ en:
support: Support
terms_of_service: Terms of Service
title: Website Links
+ settings:
+ index:
+ title: "Settings"
+ navigation_aria_label: "Settings navigation"
+ tabs:
+ platform: "Platform"
+ personal: "Personal"
+ account: "Account"
+ privacy: "Privacy"
+ platform:
+ title: "Platform Settings"
+ description: "Configure platform-wide settings and preferences."
+ coming_soon: "Platform settings are coming soon."
+ personal:
+ title: "Personal Settings"
+ description: "Manage your personal information and preferences."
+ coming_soon: "Personal settings are coming soon."
+ account:
+ title: "Account Settings"
+ description: "Update your account credentials and security settings."
+ coming_soon: "Account settings are coming soon."
+ privacy:
+ title: "Privacy Settings"
+ description: "Control your privacy and data sharing preferences."
+ coming_soon: "Privacy settings are coming soon."
block: :activerecord.models.block
community:
create_failed: Create failed
@@ -1452,6 +1477,7 @@ en:
cancel_my_account: Cancel my account
currently_waiting_confirmation_for_email: 'Currently waiting confirmation
for: %{email}'
+ edit_again: Edit Account Details
leave_blank_if_you_don_t_want_to_change_it: leave blank if you don't want
to change it
title: Edit %{resource}
diff --git a/config/locales/es.yml b/config/locales/es.yml
index e98d7beda..5b1bfb717 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1261,6 +1261,31 @@ es:
support: Soporte
terms_of_service: Términos de Servicio
title: Enlaces de Sitio Web
+ settings:
+ index:
+ title: "Configuración"
+ navigation_aria_label: "Navegación de configuración"
+ tabs:
+ platform: "Plataforma"
+ personal: "Personal"
+ account: "Cuenta"
+ privacy: "Privacidad"
+ platform:
+ title: "Configuración de Plataforma"
+ description: "Configure las preferencias de toda la plataforma."
+ coming_soon: "La configuración de plataforma estará disponible pronto."
+ personal:
+ title: "Configuración Personal"
+ description: "Gestione su información personal y preferencias."
+ coming_soon: "La configuración personal estará disponible pronto."
+ account:
+ title: "Configuración de Cuenta"
+ description: "Actualice sus credenciales de cuenta y configuración de seguridad."
+ coming_soon: "La configuración de cuenta estará disponible pronto."
+ privacy:
+ title: "Configuración de Privacidad"
+ description: "Controle sus preferencias de privacidad y compartir datos."
+ coming_soon: "La configuración de privacidad estará disponible pronto."
block: :activerecord.models.block
community:
create_failed: Creación fallida
@@ -1440,6 +1465,7 @@ es:
cancel_my_account: Anular mi cuenta
currently_waiting_confirmation_for_email: 'Actualmente esperando la confirmacion
de: %{email} '
+ edit_again: Editar Detalles de Cuenta
leave_blank_if_you_don_t_want_to_change_it: dejar en blanco si no desea cambiarla
title: Editar %{resource}
unhappy: "¿Disconforme?"
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index ce7fd9c41..3f1142d5f 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -1266,6 +1266,31 @@ fr:
support: Support
terms_of_service: Conditions d'utilisation
title: Liens de site web
+ settings:
+ index:
+ title: "Paramètres"
+ navigation_aria_label: "Navigation des paramètres"
+ tabs:
+ platform: "Plateforme"
+ personal: "Personnel"
+ account: "Compte"
+ privacy: "Confidentialité"
+ platform:
+ title: "Paramètres de Plateforme"
+ description: "Configurez les paramètres et préférences de la plateforme."
+ coming_soon: "Les paramètres de plateforme arrivent bientôt."
+ personal:
+ title: "Paramètres Personnels"
+ description: "Gérez vos informations personnelles et préférences."
+ coming_soon: "Les paramètres personnels arrivent bientôt."
+ account:
+ title: "Paramètres de Compte"
+ description: "Mettez à jour vos identifiants de compte et paramètres de sécurité."
+ coming_soon: "Les paramètres de compte arrivent bientôt."
+ privacy:
+ title: "Paramètres de Confidentialité"
+ description: "Contrôlez vos préférences de confidentialité et partage de données."
+ coming_soon: "Les paramètres de confidentialité arrivent bientôt."
block: :activerecord.models.block
community:
create_failed: Échec de la création
@@ -1466,6 +1491,7 @@ fr:
are_you_sure: Êtes-vous sûr ?
cancel_my_account: Supprimer mon compte
currently_waiting_confirmation_for_email: 'Confirmation en attente pour: %{email}'
+ edit_again: Modifier les Détails du Compte
leave_blank_if_you_don_t_want_to_change_it: laissez ce champ vide pour le
laisser inchangé
title: Éditer %{resource}
diff --git a/config/routes.rb b/config/routes.rb
index e21f52788..aa9bfb5c4 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -31,9 +31,16 @@
defaults: { format: :html, locale: I18n.locale }
get 'search', to: 'search#search'
- # Avoid clobbering admin users_path helper; keep redirect but rename helper
- get 'users', to: redirect('users/sign-in'), as: :redirect_users # redirect for user after_sign_up
+ devise_scope :user do
+ unauthenticated :user do
+ # Avoid clobbering admin users_path helper; keep redirect but rename helper
+ get 'users', to: redirect('users/sign-in'), as: :redirect_users # redirect for user after_sign_up
+ end
+ authenticated :user do
+ get 'users', to: redirect('settings#account'), as: :settings_account
+ end
+ end
# These routes are only exposed for logged-in users
authenticated :user do # rubocop:todo Metrics/BlockLength
resources :agreements
@@ -130,6 +137,8 @@
end
end
+ get 'settings', to: 'settings#index'
+
# Only logged-in users have access to the AI translation feature for now. Needs code adjustments, too.
scope path: :translations do
post 'translate', to: 'translations#translate', as: :ai_translate
diff --git a/docs/diagrams/source/user_management_flow.mmd b/docs/diagrams/source/user_management_flow.mmd
new file mode 100644
index 000000000..4bcada925
--- /dev/null
+++ b/docs/diagrams/source/user_management_flow.mmd
@@ -0,0 +1,239 @@
+graph TB
+ %% User Management Flow - End User and Platform Manager Perspectives
+ %% Better Together Community Engine
+
+ %% User Registration Flow
+ subgraph "User Registration Flow"
+ A[User Initiates Registration] --> B{Platform Privacy?}
+ B -->|Public| C[Direct Registration Form]
+ B -->|Private/Invitation-Only| D[Invitation Code Required]
+
+ D --> E{Valid Invitation Code?}
+ E -->|No| F[Show Code Entry Form]
+ E -->|Yes| G[Pre-filled Registration Form]
+ F --> H[User Enters Code]
+ H --> E
+
+ C --> I[Registration Form]
+ G --> I
+
+ I --> J[User Fills Form]
+ J --> K{Form Valid?}
+ K -->|No| L[Show Validation Errors]
+ L --> J
+
+ K -->|Yes| M[Create User Account]
+ M --> N[Create Person Profile]
+ N --> O[Process Legal Agreements]
+
+ O --> P{Invitation Present?}
+ P -->|Yes| Q[Apply Invitation Roles]
+ P -->|No| R[Default Community Member]
+
+ Q --> S[Mark Invitation Accepted]
+ R --> T[Send Confirmation Email]
+ S --> T
+
+ T --> U[User Checks Email]
+ U --> V[Click Confirmation Link]
+ V --> W[Account Activated]
+ W --> X[Sign In Available]
+ end
+
+ %% Platform Manager Invitation Management
+ subgraph "Platform Manager - Invitation System"
+ PM1[Platform Manager Access] --> PM2[Host Dashboard]
+ PM2 --> PM3[Platform Management]
+ PM3 --> PM4{Create New Invitation?}
+
+ PM4 -->|Yes| PM5[New Invitation Form]
+ PM4 -->|No| PM6[View Existing Invitations]
+
+ PM5 --> PM7[Set Invitation Details]
+ PM7 --> PM8[Assign Roles]
+ PM8 --> PM9[Set Validity Period]
+ PM9 --> PM10[Add Personal Message]
+ PM10 --> PM11[Create Invitation]
+
+ PM11 --> PM12[Generate Invitation Token]
+ PM12 --> PM13[Queue Invitation Email]
+ PM13 --> PM14[Background Email Job]
+ PM14 --> PM15[Email Delivered]
+
+ PM6 --> PM16[Invitation List View]
+ PM16 --> PM17{Invitation Actions?}
+ PM17 -->|View URL| PM18[Copy Invitation Link]
+ PM17 -->|Resend| PM19[Resend Email Job]
+ PM17 -->|Delete| PM20[Remove Invitation]
+
+ PM19 --> PM14
+ end
+
+ %% User Authentication Flow
+ subgraph "User Authentication"
+ AUTH1[User Sign In Attempt] --> AUTH2[Enter Email/Password]
+ AUTH2 --> AUTH3{Credentials Valid?}
+
+ AUTH3 -->|No| AUTH4[Show Login Error]
+ AUTH4 --> AUTH5{Too Many Attempts?}
+ AUTH5 -->|Yes| AUTH6[Account Lockout]
+ AUTH5 -->|No| AUTH2
+
+ AUTH3 -->|Yes| AUTH7{Account Confirmed?}
+ AUTH7 -->|No| AUTH8[Resend Confirmation]
+ AUTH7 -->|Yes| AUTH9[Load User Session]
+
+ AUTH9 --> AUTH10[Check Platform Privacy]
+ AUTH10 --> AUTH11{Private Platform?}
+ AUTH11 -->|Yes| AUTH12{Valid Invitation?}
+ AUTH12 -->|No| AUTH13[Access Denied]
+ AUTH12 -->|Yes| AUTH14[Grant Access]
+ AUTH11 -->|No| AUTH14
+
+ AUTH14 --> AUTH15[Load User Context]
+ AUTH15 --> AUTH16[Cache Permissions]
+ AUTH16 --> AUTH17[Redirect to Dashboard]
+ end
+
+ %% Platform Manager User Support
+ subgraph "Platform Manager - User Support"
+ SUP1[Support Request Received] --> SUP2[Categorize Issue]
+ SUP2 --> SUP3{Issue Type?}
+
+ SUP3 -->|Authentication| SUP4[Check Account Status]
+ SUP3 -->|Profile| SUP5[Review Profile Data]
+ SUP3 -->|Community Access| SUP6[Check Memberships]
+ SUP3 -->|Technical| SUP7[System Diagnostics]
+
+ SUP4 --> SUP8[Password Reset Tools]
+ SUP4 --> SUP9[Email Verification]
+ SUP4 --> SUP10[Account Unlock]
+
+ SUP5 --> SUP11[Edit Profile Access]
+ SUP5 --> SUP12[Privacy Settings]
+ SUP5 --> SUP13[Username Changes]
+
+ SUP6 --> SUP14[Role Assignment]
+ SUP6 --> SUP15[Community Membership]
+ SUP6 --> SUP16[Permission Updates]
+
+ SUP7 --> SUP17[Error Log Analysis]
+ SUP7 --> SUP18[System Health Check]
+ SUP7 --> SUP19[Escalate to Tech Team]
+
+ SUP8 --> SUP20[Implement Solution]
+ SUP9 --> SUP20
+ SUP10 --> SUP20
+ SUP11 --> SUP20
+ SUP12 --> SUP20
+ SUP13 --> SUP20
+ SUP14 --> SUP20
+ SUP15 --> SUP20
+ SUP16 --> SUP20
+ SUP17 --> SUP20
+ SUP18 --> SUP20
+
+ SUP20 --> SUP21[Test Resolution]
+ SUP21 --> SUP22[Notify User]
+ SUP22 --> SUP23[Document Solution]
+ SUP23 --> SUP24[Close Support Ticket]
+ end
+
+ %% User Profile Management
+ subgraph "User Profile Management"
+ PROF1[User Profile Access] --> PROF2[View Profile Page]
+ PROF2 --> PROF3{Edit Profile?}
+ PROF3 -->|No| PROF4[View Only Mode]
+ PROF3 -->|Yes| PROF5{User Owns Profile?}
+
+ PROF5 -->|No| PROF6[Permission Check]
+ PROF6 --> PROF7{Admin Access?}
+ PROF7 -->|No| PROF4
+ PROF7 -->|Yes| PROF8[Admin Edit Mode]
+
+ PROF5 -->|Yes| PROF9[User Edit Mode]
+
+ PROF8 --> PROF10[Edit Profile Form]
+ PROF9 --> PROF10
+
+ PROF10 --> PROF11[Update Information]
+ PROF11 --> PROF12{Changes Valid?}
+ PROF12 -->|No| PROF13[Show Validation Errors]
+ PROF13 --> PROF10
+
+ PROF12 -->|Yes| PROF14[Save Changes]
+ PROF14 --> PROF15[Update Search Index]
+ PROF15 --> PROF16[Broadcast Updates]
+ PROF16 --> PROF17[Show Success Message]
+ end
+
+ %% Platform Manager User Administration
+ subgraph "Platform Manager - User Administration"
+ ADM1[User Administration Access] --> ADM2[User Directory]
+ ADM2 --> ADM3[View All Users List]
+ ADM3 --> ADM4{Select User Action?}
+
+ ADM4 -->|View Details| ADM5[User Profile View]
+ ADM4 -->|Edit Account| ADM6[Admin Edit Access]
+ ADM4 -->|Role Management| ADM7[Role Assignment Interface]
+ ADM4 -->|Delete Account| ADM8[Account Deletion Workflow]
+
+ ADM5 --> ADM9[Review User Activity]
+ ADM9 --> ADM10[Community Memberships]
+ ADM10 --> ADM11[Content History]
+ ADM11 --> ADM12[Support History]
+
+ ADM6 --> ADM13[Modify Account Details]
+ ADM13 --> ADM14[Update Profile Information]
+ ADM14 --> ADM15[Audit Log Entry]
+
+ ADM7 --> ADM16[Platform Role Assignment]
+ ADM7 --> ADM17[Community Role Assignment]
+ ADM16 --> ADM18[Permission Recalculation]
+ ADM17 --> ADM18
+ ADM18 --> ADM19[Cache Permission Updates]
+
+ ADM8 --> ADM20[Data Export Option]
+ ADM20 --> ADM21[Confirmation Required]
+ ADM21 --> ADM22[Account Deletion]
+ ADM22 --> ADM23[Data Cleanup Jobs]
+ ADM23 --> ADM24[Audit Trail Update]
+ end
+
+ %% Security and Monitoring
+ subgraph "Security and Monitoring"
+ SEC1[Security Monitoring] --> SEC2[Failed Login Detection]
+ SEC2 --> SEC3{Suspicious Activity?}
+ SEC3 -->|Yes| SEC4[Account Lockout]
+ SEC3 -->|No| SEC5[Normal Activity Logging]
+
+ SEC4 --> SEC6[Security Alert]
+ SEC6 --> SEC7[Platform Manager Notification]
+ SEC7 --> SEC8[Investigation Required]
+
+ SEC5 --> SEC9[Activity Analytics]
+ SEC9 --> SEC10[User Engagement Tracking]
+ SEC10 --> SEC11[Platform Health Monitoring]
+
+ SEC8 --> SEC12[Account Analysis]
+ SEC12 --> SEC13{Security Risk?}
+ SEC13 -->|Yes| SEC14[Enhanced Security Measures]
+ SEC13 -->|No| SEC15[Account Recovery Process]
+
+ SEC14 --> SEC16[Password Reset Required]
+ SEC15 --> SEC17[User Notification]
+ SEC16 --> SEC18[Security Incident Documentation]
+ end
+
+ %% Styling
+ classDef userAction fill:#e1f5fe,stroke:#01579b,stroke-width:2px
+ classDef adminAction fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
+ classDef systemProcess fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
+ classDef errorState fill:#ffebee,stroke:#b71c1c,stroke-width:2px
+ classDef securityProcess fill:#fff3e0,stroke:#e65100,stroke-width:2px
+
+ class A,J,U,V,X,AUTH1,AUTH2,PROF1,PROF2,PROF3 userAction
+ class PM1,PM5,PM6,SUP1,SUP2,ADM1,ADM2,ADM3 adminAction
+ class M,N,O,T,PM11,PM12,PM13,PM14,AUTH9,AUTH15,AUTH16 systemProcess
+ class L,AUTH4,AUTH6,AUTH13,PROF13,SEC4,SEC6 errorState
+ class SEC1,SEC2,SEC8,SEC12,SEC14,SEC16 securityProcess
diff --git a/docs/end_users/user_management_guide.md b/docs/end_users/user_management_guide.md
new file mode 100644
index 000000000..0d57a1b19
--- /dev/null
+++ b/docs/end_users/user_management_guide.md
@@ -0,0 +1,411 @@
+# User Management Flow: End User Guide
+
+**Target Audience:** Community members using the platform
+**Document Type:** User Guide
+**Last Updated:** August 26, 2025
+
+## Overview
+
+This guide explains how to manage your account and navigate user-related features from an end user's perspective. Understanding these processes helps you successfully register, maintain your profile, and get support when needed.
+
+### Current Implementation Note
+
+The platform uses a centralized **Settings** page (accessible via user dropdown menu) for account management, separate from your public profile page. The Settings page features tabbed navigation with an active Account tab for email/password management, and additional tabs for Personal, Privacy, and Platform settings (coming soon).
+
+## User Registration Process
+
+### Registration Methods
+
+**Public Platforms:**
+- Direct registration at `/users/sign_up`
+- Create account with email, password, and profile details
+- Accept platform agreements (Terms of Service, Privacy Policy, Code of Conduct)
+
+**Private Platforms (Invitation-Only):**
+- Receive invitation email with unique invitation code
+- Click invitation link or enter code manually
+- Registration form pre-filled with invited email
+- Automatic role assignment based on invitation
+- Accept platform agreements
+
+### Registration Steps
+
+1. **Access Registration**
+ - Visit the sign-up page
+ - If invitation-only: Enter invitation code or follow invitation link
+
+2. **Email and Authentication**
+ - Provide valid email address (your login username)
+ - Create secure password (minimum 12 characters)
+ - Confirm password
+
+3. **Profile Information**
+ - **Name:** Your display name (publicly visible)
+ - **Username/Identifier:** Unique handle for your profile
+ - **Description:** Optional bio/introduction
+
+4. **Legal Agreements**
+ - Review and accept Terms of Service
+ - Review and accept Privacy Policy
+ - Review and accept Code of Conduct (if applicable)
+
+5. **Email Verification**
+ - Check your email for confirmation link
+ - Click link to activate your account
+ - Sign in with your credentials
+
+### Profile Setup
+
+After registration, complete your profile:
+
+- **Contact Information:** Add phone numbers, addresses
+- **Privacy Settings:** Control profile visibility
+- **Notification Preferences:** Manage email/in-app notifications
+- **Community Memberships:** Join relevant communities
+- **Profile Image:** Upload avatar (optional)
+
+## Account Management
+
+### Accessing Account Settings
+
+- **Navigation:** Click on your profile image in the top navigation, then select "Settings" from the dropdown menu
+- **Direct URL:** `/settings`
+- **Settings Page:** Features tabbed interface for different types of settings
+
+### Settings Navigation Structure
+
+The Settings page is organized into several tabs:
+
+**Account Tab** (Primary)
+- Update email address
+- Change password
+- Current password verification required for all changes
+- Direct integration with account security features
+
+**Personal Tab** (Coming Soon)
+- Personal information management
+- Profile customization options
+- Display preferences
+
+**Privacy Tab** (Coming Soon)
+- Privacy and data sharing controls
+- Visibility settings
+- Communication preferences
+
+**Platform Tab** (Coming Soon)
+- Platform-wide settings and preferences
+- Administrative options (where applicable)
+
+### Accessing Your Public Profile
+
+- **Navigation:** Click "My Profile" in user dropdown menu
+- **Direct URL:** `/people/[your-username]`
+- **Edit Profile:** Use "Edit" button (only you can edit your own profile)
+
+### Profile Components
+
+**Basic Information:**
+- Name and username
+- Profile description/bio
+- Contact details (visibility controlled by privacy settings)
+- Community memberships and roles
+
+**Privacy Controls:**
+- **Public:** Profile visible to all users
+- **Private:** Profile only visible to community members
+- **Contact Visibility:** Control who sees your contact information
+
+**Notification Management:**
+- Message notifications
+- Community activity alerts
+- System announcements
+- Email delivery preferences
+
+### Updating Account Information
+
+1. **Access Settings**
+ - Click your profile image in the top navigation
+ - Select "Settings" from the dropdown menu
+ - Navigate to the "Account" tab
+
+2. **Available Updates**
+ - **Email Address:** Change your login email (requires confirmation)
+ - **Password:** Set a new password (requires current password)
+ - **Current Password:** Always required for security verification
+
+3. **Save Changes**
+ - Enter your current password for verification
+ - Click "Update" to save changes
+ - Changes take effect immediately
+
+4. **Important Notes**
+ - Email changes require confirmation via new email address
+ - Strong passwords (12+ characters) are required
+ - You'll remain logged in after password changes
+
+## Authentication & Security
+
+### Sign In Process
+
+1. Visit sign-in page: `/users/sign_in`
+2. Enter email and password
+3. Click "Sign In"
+4. Redirected to dashboard or previous page
+
+### Password Management
+
+**Changing Password:**
+1. Access Settings via user dropdown menu
+2. Navigate to "Account" tab
+3. Leave password field blank to keep current password
+4. Enter new password (twice) to change it
+5. Enter current password for verification
+6. Click "Update" to save changes
+
+**Forgot Password:**
+1. Click "Forgot Password" on sign-in page
+2. Enter your email address
+3. Check email for reset link
+4. Follow link and create new password
+
+### Account Security
+
+- **Settings Access:** Centralized account management via Settings page
+- **Password Requirements:** Minimum 12 characters for strong security
+- **Current Password Verification:** Required for all account changes
+- **Session Management:** Automatic logout after inactivity
+- **Device Security:** Log out from all devices if needed
+- **Email Verification:** Required for all new accounts and email changes
+- **Two-Factor Authentication:** Available in security settings (planned feature)
+
+## Getting Support
+
+### Self-Service Resources
+
+**Help Documentation:**
+- User guides and FAQs
+- Video tutorials (if available)
+- Community forums for peer support
+
+**Account Issues:**
+- Password reset tools
+- Email verification resend
+- Profile recovery options
+
+### Contacting Support
+
+**When to Contact Support:**
+- Cannot access your account
+- Technical issues with platform
+- Questions about features
+- Report bugs or problems
+- Account security concerns
+
+**How to Contact Support:**
+- **Support Email:** Available in platform footer
+- **Contact Form:** Usually found in "Help" or "Support" section
+- **In-App Messaging:** Direct message to support team (if available)
+
+**Information to Include:**
+- Your username/email
+- Description of the issue
+- Steps you've already tried
+- Browser/device information
+- Screenshots if applicable
+
+### Support Response
+
+- **Response Time:** Typically 24-48 hours for non-urgent issues
+- **Priority Issues:** Account security and access issues prioritized
+- **Follow-up:** Support team may request additional information
+- **Resolution:** You'll receive confirmation when issue is resolved
+
+## Common User Scenarios
+
+### First-Time Registration
+
+1. **Receive Invitation** (private platforms)
+ - Check email for invitation
+ - Click invitation link
+ - Note any special roles mentioned
+
+2. **Complete Registration**
+ - Fill out registration form
+ - Accept all required agreements
+ - Verify email address
+
+3. **Initial Setup**
+ - Complete profile information
+ - Set privacy preferences
+ - Join relevant communities
+ - Explore platform features
+
+### Profile Updates
+
+1. **Account Settings (Primary)**
+ - Access via Settings → Account tab
+ - Update email and password
+ - Security-focused changes
+
+2. **Profile Information (Public)**
+ - Access via "My Profile" in dropdown
+ - Update name, username, and description
+ - Manage contact information
+ - Adjust privacy settings
+ - Upload profile image
+
+3. **Settings Organization**
+ - **Account Tab:** Login credentials and security
+ - **Personal Tab:** Profile information and preferences (coming soon)
+ - **Privacy Tab:** Visibility and data controls (coming soon)
+
+### Account Issues
+
+1. **Login Problems**
+ - Verify email/password
+ - Check for typos
+ - Use password reset if needed
+ - Contact support if persistent
+
+2. **Profile Visibility**
+ - Check privacy settings
+ - Verify community memberships
+ - Ensure profile is complete
+ - Ask community administrators if needed
+
+## Privacy and Data Protection
+
+### Data Collection
+
+The platform collects:
+- Registration information (email, name, username)
+- Profile information (description, contact details)
+- Usage data (login times, page views, interactions)
+- Community participation (posts, comments, memberships)
+
+### Data Control
+
+**You Can:**
+- View all your personal data
+- Update your information anytime
+- Delete your account and data
+- Control who sees your profile
+- Manage email communications
+
+**Platform Uses Data For:**
+- Account authentication and security
+- Personalized experience
+- Community features and matching
+- Analytics and platform improvement
+- Communication about platform updates
+
+### Data Sharing
+
+- **Within Communities:** Profile information shared with community members
+- **Public Information:** Name and username may be publicly visible
+- **No Third-Party Sales:** Personal data not sold to external companies
+- **Legal Requirements:** Data may be shared if legally required
+
+## Tips for Success
+
+### Profile Best Practices
+
+- **Complete Profile:** Fill out all relevant sections
+- **Professional Photo:** Use clear, appropriate profile image
+- **Engaging Description:** Write helpful bio that explains your interests
+- **Keep Updated:** Regularly review and update information
+- **Privacy Awareness:** Understand what information is public vs. private
+
+### Community Participation
+
+- **Follow Guidelines:** Read and follow community-specific rules
+- **Be Respectful:** Maintain respectful communication
+- **Stay Active:** Regular participation improves experience
+- **Report Issues:** Use reporting tools for inappropriate content
+- **Seek Help:** Ask questions when you need assistance
+
+### Security Best Practices
+
+- **Strong Password:** Use unique, complex password
+- **Regular Updates:** Keep contact information current
+- **Secure Devices:** Log out from public/shared computers
+- **Monitor Activity:** Review account activity regularly
+- **Report Suspicious:** Contact support for security concerns
+
+## Troubleshooting Common Issues
+
+### Cannot Register
+
+**Problem:** Registration form shows errors
+**Solutions:**
+- Check email format is valid
+- Ensure password meets requirements
+- Verify all required fields completed
+- Clear browser cache and try again
+- Try different browser
+
+### Email Not Received
+
+**Problem:** Confirmation email not arriving
+**Solutions:**
+- Check spam/junk folder
+- Wait 10-15 minutes for delivery
+- Verify email address is correct
+- Request new confirmation email
+- Contact support if persistent
+
+### Profile Not Visible
+
+**Problem:** Other users cannot see your profile
+**Solutions:**
+- Check privacy settings
+- Verify community membership status
+- Ensure profile information is complete
+- Confirm account is activated
+- Ask community organizer
+
+### Cannot Access Settings
+
+**Problem:** Settings page not loading or accessible
+**Solutions:**
+- Ensure you're logged in to your account
+- Clear browser cache and cookies
+- Try accessing Settings directly via URL: `/settings`
+- Verify user dropdown menu is functioning
+- Contact support if page consistently fails to load
+
+### Settings Page Issues
+
+**Problem:** Settings tabs not working or content not loading
+**Solutions:**
+- Refresh the page and try again
+- Check internet connection stability
+- Disable browser extensions temporarily
+- Try in incognito/private browser mode
+- Contact support with specific tab/error details
+
+## Related Documentation
+
+- [Platform Privacy Policy](privacy_policy.md)
+- [Community Guidelines](community_guidelines.md)
+- [Safety and Reporting Tools](safety_reporting.md)
+- [Messaging and Communication](messaging_guide.md)
+- [Community Participation Guide](community_participation.md)
+
+## Quick Reference
+
+### Key Navigation Paths
+- **Settings Page:** User dropdown → "Settings" or direct URL `/settings`
+- **Account Management:** Settings → Account tab
+- **Public Profile:** User dropdown → "My Profile"
+- **Profile Editing:** My Profile → "Edit" button
+
+### Current Settings Structure
+- **Account Tab:** ✅ Active (email, password, security)
+- **Personal Tab:** 🔄 Coming Soon (personal info, preferences)
+- **Privacy Tab:** 🔄 Coming Soon (privacy, visibility controls)
+- **Platform Tab:** 🔄 Coming Soon (platform-wide settings)
+
+---
+
+*For additional support, contact the platform support team or refer to the comprehensive help documentation.*
diff --git a/docs/platform_organizers/user_management.md b/docs/platform_organizers/user_management.md
new file mode 100644
index 000000000..4f02f4cd3
--- /dev/null
+++ b/docs/platform_organizers/user_management.md
@@ -0,0 +1,502 @@
+# User Management: Platform Organizer Guide
+
+**Target Audience:** Platform Organizers and Support Staff
+**Document Type:** Administrative Guide
+**Last Updated:** August 26, 2025
+
+## Overview
+
+This guide explains user management from the Platform Organizer perspective, including user oversight, invitation management, account support, and administrative tools. Platform Organizers have elevated permissions to manage users across the entire platform.
+
+## Platform User Management Overview
+
+### User Lifecycle
+
+1. **Invitation/Registration** → 2. **Account Verification** → 3. **Profile Completion** → 4. **Community Participation** → 5. **Ongoing Support**
+
+### Administrative Responsibilities
+
+- **User Account Oversight:** Monitor user registrations and activations
+- **Invitation Management:** Create and manage platform invitations
+- **Support Resolution:** Handle user support requests and account issues
+- **Security Monitoring:** Monitor for suspicious activity and abuse
+- **Data Management:** Handle data requests and account deletions
+- **Compliance:** Ensure platform compliance with policies and regulations
+
+## User Registration Management
+
+### Registration Modes
+
+**Public Registration:**
+- Users can self-register without invitations
+- Open to anyone with valid email
+- Subject to platform terms and agreements
+- Configurable via Platform Settings → "Requires Invitation" (disabled)
+
+**Invitation-Only Registration:**
+- Platform requires invitation codes for registration
+- Controlled access and user vetting
+- Default setting for hosted platforms
+- Configurable via Platform Settings → "Requires Invitation" (enabled)
+
+### Managing Registration Settings
+
+**Access:** Host Dashboard → Platforms → Edit → "Requires Invitation"
+
+**Public Mode Benefits:**
+- Faster community growth
+- Lower barrier to entry
+- Suitable for open communities
+- Self-service registration
+
+**Invitation-Only Benefits:**
+- Controlled user quality
+- Reduced spam and abuse
+- Curated community building
+- Better security control
+
+## Platform Invitation System
+
+### Creating Invitations
+
+**Access:** Host Dashboard → Platforms → [Platform Name] → "New Invitation"
+
+**Invitation Types:**
+- **Platform Invitation:** Standard invitation with platform/community roles
+- **Custom Invitations:** Extended functionality (venue-specific, organization-specific)
+
+**Required Information:**
+- **Invitee Email:** Target email address
+- **Platform Role:** Role within the platform (optional)
+- **Community Role:** Role within the default community (optional)
+- **Locale:** Language for invitation email
+- **Validity Period:** Start and end dates for invitation
+- **Personal Greeting:** Custom message to invitee
+
+**Role Assignment Options:**
+- **Platform Roles:** platform_manager, platform_tech_support, platform_developer, etc.
+- **Community Roles:** community_member, community_facilitator, community_governance_council, etc.
+
+### Managing Existing Invitations
+
+**Invitation Dashboard:** Host Dashboard → Platforms → [Platform Name] → Invitations List
+
+**Available Actions:**
+- **View Invitation URL:** Copy link to share manually
+- **Resend Invitation:** Send new email with same invitation
+- **Delete Invitation:** Remove invitation (cannot be undone)
+
+**Invitation Status Tracking:**
+- **Pending:** Invitation sent, waiting for acceptance
+- **Accepted:** User registered and invitation processed
+- **Expired:** Invitation past validity period
+- **Revoked:** Invitation manually canceled
+
+**Invitation Information Displayed:**
+- Invitee email address
+- Inviter (who created the invitation)
+- Platform and community roles assigned
+- Status and acceptance date
+- Last sent timestamp
+- Validity period
+
+### Invitation Email Management
+
+**Email Delivery:**
+- Background job processing via Sidekiq
+- Automatic retry on delivery failures
+- Time zone-aware sending (platform's time zone)
+- Localized content based on invitation locale
+
+**Email Content:**
+- Platform branding
+- Personal greeting (if provided)
+- Role information (if roles assigned)
+- Invitation link and code
+- Validity period information
+- Contact information
+
+### Bulk Invitation Management
+
+**Best Practices:**
+- Create invitations in batches for easier management
+- Use consistent role assignments for user groups
+- Set appropriate validity periods (30-90 days recommended)
+- Include personal greetings to improve acceptance rates
+
+**Tracking and Analytics:**
+- Monitor invitation acceptance rates
+- Track which inviters have highest success rates
+- Identify patterns in expired invitations
+- Review role assignments for consistency
+
+## User Account Administration
+
+### User Directory Access
+
+**Access:** Host Dashboard → Users
+
+**User List Features:**
+- Email address display
+- Account status indicators
+- Registration date information
+- Platform and community role assignments
+- Direct access to user profiles
+
+**Available Actions per User:**
+- **View Profile:** Access full user profile information
+- **Edit Account:** Modify user account details (limited)
+- **Delete Account:** Remove user and associated data
+- **Role Management:** Assign/remove platform and community roles
+
+### User Account Information
+
+**Profile Data Access:**
+- Personal information (name, username, description)
+- Contact details (email, phone numbers, addresses)
+- Community memberships and roles
+- Account activity and login history
+- Content and interaction history
+
+**Privacy Considerations:**
+- Access limited to users with proper permissions
+- Audit trail of administrative actions
+- Data access logged for compliance
+- Respect user privacy settings where possible
+
+### Account Status Management
+
+**Account States:**
+- **Active:** Normal, fully functional account
+- **Pending Confirmation:** Registered but email not verified
+- **Suspended:** Temporarily disabled account
+- **Deleted:** Account marked for deletion
+
+**Status Change Authority:**
+- Platform Organizers can modify most account states
+- Some actions require higher privileges or approval
+- Critical actions are logged and auditable
+- User notification for status changes
+
+## User Support and Issue Resolution
+
+### Common Support Categories
+
+**Authentication Issues:**
+- Password reset requests
+- Email verification problems
+- Account lockouts
+- Login difficulties
+- Settings page access problems
+
+**Account Management:**
+- Settings navigation confusion
+- Account tab functionality issues
+- Email change verification problems
+- Password update difficulties
+- Current password verification failures
+
+**Profile Management:**
+- Information update requests
+- Privacy setting confusion
+- Username change requests
+- Profile visibility issues
+- Settings vs. Profile distinction
+
+**Navigation Issues:**
+- Settings page not loading
+- Tab switching problems
+- User dropdown menu issues
+- Settings URL access problems
+
+**Technical Problems:**
+- Platform functionality issues
+- Browser compatibility problems
+- Feature malfunction reports
+- Performance concerns
+
+### Support Request Handling
+
+**Initial Triage:**
+1. Categorize the issue type
+2. Assess urgency and impact
+3. Determine required permissions for resolution
+4. Assign to appropriate support staff
+
+**Investigation Process:**
+1. **Gather Information:**
+ - User account details
+ - Error messages or screenshots
+ - Steps to reproduce issue
+ - Browser/device information
+
+2. **Account Analysis:**
+ - Check account status and history
+ - Review recent activity logs
+ - Verify role and permission assignments
+ - Check community memberships
+
+3. **System Verification:**
+ - Test functionality with test accounts
+ - Check system status and health
+ - Review recent platform changes
+ - Verify configuration settings
+
+**Resolution Strategies:**
+- **Self-Service:** Guide user to self-resolution tools
+- **Administrative Fix:** Resolve issue through admin interface
+- **Technical Escalation:** Forward to development team
+- **Policy Decision:** Escalate to platform governance
+
+### Support Tools and Resources
+
+**Administrative Interfaces:**
+- User management dashboard
+- Role and permission management
+- Community membership tools
+- Invitation system controls
+- Settings page monitoring and debugging
+
+**User Interface Tools:**
+- Settings page (user-facing)
+- Account tab functionality
+- Profile editing interfaces
+- Navigation dropdown monitoring
+
+**Diagnostic Tools:**
+- User activity logs
+- System error logs
+- Performance monitoring
+- Security event tracking
+- Settings page usage analytics
+
+**Communication Tools:**
+- Direct messaging system
+- Email notification system
+- Announcement capabilities
+- Community bulletin posting
+
+## Security and Compliance
+
+### Security Monitoring
+
+**Account Security:**
+- Monitor failed login attempts
+- Track unusual account activity
+- Detect potential account takeovers
+- Review privilege escalation requests
+
+**Platform Security:**
+- Monitor for spam or abuse patterns
+- Track content policy violations
+- Identify suspicious user behavior
+- Coordinate with content moderation
+
+**Data Protection:**
+- Handle data access requests
+- Manage account deletion requests
+- Ensure data retention compliance
+- Coordinate with legal requirements
+
+### Compliance Management
+
+**Data Protection Compliance:**
+- GDPR/privacy law compliance
+- User consent management
+- Data retention policies
+- Right to deletion processing
+
+**Platform Policy Enforcement:**
+- Terms of Service violations
+- Community guideline enforcement
+- User conduct standards
+- Appeal and review processes
+
+**Audit and Reporting:**
+- Administrative action logging
+- User data access tracking
+- Security incident documentation
+- Compliance reporting requirements
+
+## Administrative Workflows
+
+### New User Onboarding
+
+1. **Invitation Creation** (for private platforms)
+ - Create invitation with appropriate roles
+ - Send invitation with personalized message
+ - Track invitation delivery and acceptance
+
+2. **Registration Support**
+ - Monitor for registration issues
+ - Assist with email verification problems
+ - Help with initial profile setup
+ - Guide users to Settings page for account management
+ - Provide platform orientation
+
+3. **Post-Registration Account Setup**
+ - Guide users to Settings via dropdown navigation
+ - Help configure Account tab settings
+ - Assist with profile completion via "My Profile"
+ - Ensure proper community membership
+ - Verify role assignments are correct
+ - Follow up on early experience with settings navigation
+
+### Account Issue Resolution
+
+1. **Issue Intake**
+ - Receive support request
+ - Categorize and prioritize
+ - Assign to appropriate team member
+ - Set response time expectations
+
+2. **Investigation and Diagnosis**
+ - Gather relevant information
+ - Reproduce issue if possible
+ - Analyze account and system state
+ - Determine root cause
+
+3. **Resolution Implementation**
+ - Apply appropriate fix
+ - Test resolution effectiveness
+ - Document solution steps
+ - Notify user of resolution
+
+4. **Follow-up and Closure**
+ - Confirm issue is resolved
+ - Update support documentation
+ - Close support ticket
+ - Analyze for pattern prevention
+
+### User Lifecycle Management
+
+**Active User Monitoring:**
+- Track user engagement levels
+- Identify at-risk users
+- Provide proactive support
+- Recognize valuable contributors
+
+**Inactive User Management:**
+- Identify dormant accounts
+- Send re-engagement communications
+- Clean up unused accounts
+- Manage data retention policies
+
+**Account Termination:**
+- Process account deletion requests
+- Handle suspended account procedures
+- Manage data export requests
+- Ensure compliance with deletion requirements
+
+## Best Practices
+
+### Invitation Management
+
+- **Clear Role Communication:** Explain role assignments in invitation messages
+- **Appropriate Validity Periods:** Set reasonable expiration dates (30-90 days)
+- **Personal Touch:** Include personalized messages to improve acceptance
+- **Follow-up:** Check on invitation acceptance and provide support
+- **Documentation:** Keep records of invitation purposes and outcomes
+
+### User Support Excellence
+
+- **Rapid Response:** Acknowledge requests quickly (within 24 hours)
+- **Clear Communication:** Use non-technical language when appropriate
+- **Complete Solutions:** Ensure issues are fully resolved
+- **Documentation:** Maintain detailed support history
+- **Learning:** Use support patterns to improve platform
+
+### Security and Privacy
+
+- **Least Privilege:** Grant minimum necessary access rights
+- **Audit Trails:** Maintain logs of all administrative actions
+- **Privacy Respect:** Access user data only when necessary
+- **Secure Communications:** Use secure channels for sensitive information
+- **Regular Reviews:** Periodically review user access and roles
+
+### Platform Administration
+
+- **Consistent Policies:** Apply policies fairly and consistently
+- **Community Focus:** Balance individual needs with community welfare
+- **Proactive Management:** Address issues before they escalate
+- **Continuous Improvement:** Regular review and enhancement of processes
+- **Stakeholder Collaboration:** Work closely with community organizers
+
+## Tools and Resources
+
+### Administrative Dashboards
+
+**Host Dashboard:** Primary platform management interface
+- User management tools
+- Invitation system controls
+- Platform configuration options
+- Analytics and reporting
+
+**Community Management:** Community-specific tools
+- Member management
+- Role assignments
+- Community settings
+- Local moderation tools
+
+### Monitoring and Analytics
+
+**User Metrics:**
+- Registration and activation rates
+- User engagement levels
+- Community participation
+- Support request patterns
+
+**Platform Health:**
+- System performance monitoring
+- Security event tracking
+- Feature usage analytics
+- Error and issue reporting
+
+### Documentation and Training
+
+**Internal Resources:**
+- Administrative procedures guide
+- User support playbooks
+- Security incident response plans
+- Compliance checklists
+
+**User Resources:**
+- Platform user guides
+- FAQ documentation
+- Video tutorials
+- Community guidelines
+
+## Escalation Procedures
+
+### Technical Issues
+
+1. **Level 1:** Basic support staff resolution
+2. **Level 2:** Platform organizer intervention
+3. **Level 3:** Development team escalation
+4. **Level 4:** System administrator involvement
+
+### Policy Issues
+
+1. **Community Level:** Community organizer review
+2. **Platform Level:** Platform organizer decision
+3. **Governance Level:** Platform governance review
+4. **Legal Level:** Legal counsel involvement
+
+### Security Incidents
+
+1. **Initial Response:** Immediate threat mitigation
+2. **Investigation:** Detailed incident analysis
+3. **Coordination:** Multi-team incident response
+4. **Resolution:** Complete incident remediation
+
+## Related Documentation
+
+- [Platform Administration Guide](platform_administration.md)
+- [Security and Privacy Policies](security_privacy.md)
+- [Community Management Tools](community_management.md)
+- [User Support Procedures](user_support_procedures.md)
+- [Compliance and Legal Guidelines](compliance_legal.md)
+
+---
+
+*This guide is regularly updated to reflect changes in platform capabilities and best practices. For additional questions or clarifications, consult the platform development team or governance council.*
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 8872de0a4..e3d8d147e 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -20,6 +20,7 @@
require 'capybara-screenshot/rspec'
require 'simplecov'
require 'coveralls'
+require 'rspec/rebound'
# Allow CI/local runs to override coverage output to avoid permission issues
SimpleCov.coverage_dir ENV['SIMPLECOV_DIR'] if ENV['SIMPLECOV_DIR']
@@ -55,6 +56,19 @@
end
RSpec.configure do |config|
+ # show retry status in spec process
+ config.verbose_retry = true
+ # show exception that triggers a retry if verbose_retry is set to true
+ config.display_try_failure_messages = true
+
+ # run retry only on features
+ config.around :each, type: :feature do |ex|
+ ex.run_with_retry retry: 3
+ end
+ config.around :each, :js do |ex|
+ ex.run_with_retry retry: 3
+ end
+
# Use Capybara’s DSL in feature specs
config.include Capybara::DSL