technical:features:23_practice_settings_and_team_labels
Table of Contents
23 — Practice settings and team labels
Technical reference. For task-based help, see the corresponding user guide.
Documentation status: reviewed against implementation · Reviewed: 2026-07-21 · Primary users: coach, practice owner and organization administrator · Surfaces: coach portal, mobile web and platform API
Purpose
Practice settings give a coach a consistent public identity and give the practice an internal vocabulary for organizing families. A team label can represent a coach, pod or internal case owner, but it is deliberately not an authorization role and never changes which families a coach can access.
User outcomes
| Persona | Outcome |
|---|---|
| Coach | Updates their own display name and profile image. |
| Practice owner | Updates the organization/practice name shown across coach experiences. |
| Active coach member | Creates a shared organization list of team labels and assigns one saved label to an eligible family. |
| Coach reviewing a roster | Filters and scans families by team label without changing access. |
Entry points
| Surface | Entry point | What is available |
|---|---|---|
| Coach portal | Account | Coach name, practice name, profile image and team-label editor. |
| Coach portal | Families | Label filter and per-family label selection. |
| Mobile web | Coach side menu → account/team labels | Shared label editor and explanation of label semantics. |
| Mobile web | Coach dashboard/family picker | Label badges, filtering and per-family selection. |
Functional flow
1. Update coach and practice identity
- The coach edits their name and, where authorized, the practice name.
- Both fields are required by the coach-portal form after trimming.
- A new profile image is prepared at a maximum side of 512 px and approximately 0.8 quality, uploaded through a 15-minute signed URL, and then referenced by its object path.
- Removing the image sends a null profile asset reference. Saving returns a fresh session so the shell can update immediately.
- Any authenticated user may update their own name/profile reference. A business-name change additionally requires a coach who is an active owner of the organization.
2. Maintain the shared label vocabulary
- Labels are stored on one active organization and are shared by its coach workspace.
- Whitespace is trimmed and internal runs of whitespace are collapsed.
- A label must contain 1–40 characters. An organization may retain at most 25 labels.
- Duplicate comparison is case-insensitive; the first canonical spelling is retained.
- Coaches can add, inline-rename and remove labels. A rename request includes an explicit old-to-new mapping so existing assignments follow the rename transactionally.
- Removing a label clears that label from every assignment in the same organization.
3. Assign and filter families
- A coach selects either one of the saved labels or No label for a family.
- The server accepts only a canonical label already saved by the assignment's organization.
- Assignment requires the coach's own active, non-past family assignment, active organization membership, an organization that still permits coach access, an active coach subscription and current support access.
- The returned family record replaces the local roster item. Portal and mobile filters then operate on the label value.
Validation and user-visible states
| State | Behaviour |
|---|---|
| Labels loading | Editors and family selectors wait for the organization label response. |
| Empty vocabulary | The UI invites the coach to add a label; family selectors have no label choices. |
| Duplicate or blank label | The normalized duplicate is ignored or the form asks for a non-empty value. |
| More than 25 / over 40 characters | Save is rejected with the shared validation limit. |
| Rename | Assigned families move to the replacement label in the same write. |
| Remove | Assigned families become unlabeled; no family access is revoked. |
| Ineligible family | Label mutation is denied and the existing roster state remains. |
| Profile upload failure | The profile write is not completed with the failed new object; the coach can retry. |
Platform API contract
| Method and route | Purpose |
|---|---|
PATCH /auth/profile | Update actor name/profile asset; coach owners may also update businessName. |
GET /coach/organization/case-owner-labels | Read normalized labels for the coach's eligible organization. |
PUT /coach/organization/case-owner-labels | Replace the label list and optionally propagate renames. |
PATCH /coach/families/:familyId/case-owner-label | Assign a saved label or null to the coach's active family assignment. |
POST /files/signed-upload-url | Authorize the profile-image upload; see Feature 30. |
Authorization, scope and privacy
- Label-list access requires a coach with an active
coach,ownerororganizationAdminmembership in a non-suspended, non-archived organization. - A family label lives on the coach–family assignment, not the family account. Other organizations do not inherit it.
- A label is internal operational metadata. Family screens do not use it as a family-visible role or access rule.
- Family access, subscription and support-period checks remain server-side; a label never broadens them.
- Profile-image object access is separately authorized and short-lived.
Important: Team labels organize a roster only. They do not create accounts, split a practice into security partitions, hide families from another otherwise-authorized coach, or grant permissions.
Acceptance checklist
- [ ] Coach name and owner-authorized practice name persist and refresh the session.
- [ ] Profile upload/remove presents a stable preview and recoverable error state.
- [ ] Label input trims/collapses whitespace, prevents case-insensitive duplicates, and enforces 25 × 40 limits.
- [ ] Rename propagates to assignments and removal clears obsolete assignments.
- [ ] Only a saved organization label or null can be assigned.
- [ ] Portal and mobile badges/filters reflect the updated family returned by the API.
- [ ] Tests prove that labels do not affect family authorization.
Source evidence
- Coach portal:
admin-web/src/routes/AccountPanel.tsx,admin-web/src/routes/FamiliesPanel.tsx - Mobile web:
mobile-web/src/components/CoachSideMenu.tsx,CoachFamilyPicker.tsx,mobile-web/src/routes/CoachDashboard.tsx - Platform:
platform/packages/shared/src/coach.ts,platform/apps/api/src/routes/coach-routes.ts,platform/apps/api/src/services/family-service.ts,platform/apps/api/src/services/prisma-invite-flow-service.ts,platform/apps/api/src/services/auth-service.ts
