AidOrbit Canonical User Story Development Plan
Last updated: 2026-08-10
Purpose
This is the canonical, checklist-driven user story plan for AidOrbit development. It consolidates the useful requirements from docs/front-end-plan.md, the journey-first product contract under docs/product/, implemented product surfaces, internal audits, and newly identified volunteer-platform needs.
The user-story and backlog sections in docs/front-end-plan.md are historical input, not completion authority. When they disagree with this plan, this plan controls future user-story tracking. Current source code remains the authority for what is actually implemented.
No story in this file is considered complete merely because a component, route, seeded dataset, local-storage prototype, API scaffold, test scaffold, or documentation page exists. Existing functionality starts unchecked and may be checked quickly after its complete journey evidence is revalidated.
Product Boundaries
- Canonical model:
Organization > Program > Mission > Shift/Role > Volunteer > Registration > Attendance > Hours. - User-facing copy uses Mission/Missions. Legacy Opportunity naming is allowed only for internal compatibility.
- Program Manager and Program Staff access is assigned-Program scoped unless explicitly broadened.
- UI visibility never substitutes for backend/API authorization.
- Public, private, invite-only, unpublished, canceled, expired, and cross-Program data remain distinct.
- PostgreSQL compatibility is required for SQL, migrations, generated queries, reports, fixtures, and tests.
- GoodNearby and WordPress changes must preserve the public visitor journey and the authenticated AidOrbit owner journey.
- Program vertical behavior is additive and Program scoped. It must not replace or globally rename the core model.
Cross-Repository Delivery Contract
Use the repository that owns the persona's experience. A shared database, API, embed, or link does not make aidorbit-web the correct frontend for every story.
| Repository | Owns | Does not own |
|---|---|---|
aidorbit-web | Authenticated Organization, Program Manager, Program Staff, check-in, and administration operations; source-of-truth workflows and authorization; PostgreSQL migrations; APIs and publication-state enforcement that safely serve other surfaces. | The volunteer-facing Mission search, public Organization/Program/Mission portal, or Volunteer self-service experience. Do not add Volunteer Mission-discovery UI here. |
goodnearby-web / GoodNearby site | The Volunteer portal: public Mission discovery and search, public Organization and Program pages, Mission details, Volunteer account entry and self-service journeys, registration continuity, and volunteer-facing mobile/accessibility behavior. | Staff operations, organization administration, source-of-truth publication controls, or unrestricted cross-organization data. It consumes only scoped, published public data and authorized Volunteer data. |
aidorbit-wordpress | Marketing/editorial website pages and authorized public-content embeds, referrals, and integrations that point visitors into the GoodNearby Volunteer portal or authenticated AidOrbit operations. | A second Volunteer portal, Mission search index, registration system, or a bypass around AidOrbit authorization/publication rules. |
For every story, record the owning repository and any coordinated repositories in the journey contract and completion record. Start implementation in the owner repository; inspect and update another repository only when the end-to-end contract, shared API, embed, navigation, branding, or redirect is affected.
Volunteer discovery rule: volunteers search for and browse Missions on the GoodNearby site, not in aidorbit-web. aidorbit-web may expose the authenticated operational API and publication controls that power GoodNearby, but it must not become a competing Volunteer Mission-search frontend. Where an older AidOrbit public route still exists for compatibility, treat it as a backend/redirect compatibility surface and do not extend it as the Volunteer product experience.
Cross-repository Definition of Done: verify the owner-surface route is reachable, the handoff or embed preserves Organization/Program/Mission scope, both repositories enforce the appropriate authorization and publication boundaries, and documentation links point Volunteers to GoodNearby and staff to AidOrbit.
How To Use This Plan
- Select the highest-priority unchecked story whose dependencies are satisfied.
- Identify the owning repository using the cross-repository delivery contract, then read the applicable persona, core journey, workflow-state, permissions, edge-case, and E2E guidance under
docs/product/. - For non-trivial product changes, create or update a journey contract from
docs/product/templates/journey-contract.md. - Inspect the real route, UI, API, persistence, authorization, notification, reporting, mobile, accessibility, and documentation surfaces before editing.
- Implement the smallest coherent end-to-end slice.
- Add a completion record beneath the story using the template below.
- Check the story only after every applicable Definition of Done requirement has evidence.
Do not change [ ] to [x] based only on an older status claim. If a story is partly delivered, leave it unchecked and record the verified portion and remaining gap.
Priority And Status Rules
| Priority | Meaning |
|---|---|
| P0 | Core lifecycle, safety, privacy, authorization, data integrity, or release-critical journey. |
| P1 | Important operating capability required for a mature customer workflow. |
| P2 | Specialized persona, differentiation, scale, or advanced workflow. |
| Discovery | Candidate that needs product validation before implementation commitment. |
The checkbox is the canonical status:
[ ]means not verified complete. This includes planned, partial, prototype, implemented-but-unverified, and blocked work.[x]means the complete user outcome is implemented and the completion record satisfies the Definition of Done.- External credentials, live-provider checks, app-store review, DNS, deployment, customer acceptance, or other manual gates must remain unchecked until actually completed.
Definition Of Done For Every Story
All applicable items below must be satisfied before checking a story:
- The primary persona can reach the workflow from the intended desktop and mobile entry points.
- Empty, loading, success, validation, denied, error, canceled, and retry states are honest and usable.
- The backend persists the result in the correct Organization, Program, Mission, Volunteer, or self scope.
- Backend/API authorization matches the UI and direct URL or direct-ID access fails closed.
- Workflow-state transitions and prohibited transitions match
docs/product/03-workflow-states.md. - Capacity, rosters, readiness, attendance, hours, dashboards, reports, exports, notifications, and audit logs reconcile where affected.
- Sensitive fields and documents are omitted unless the actor has explicit need and permission.
- Email, SMS, push, and in-app messages use the correct audience, current state, consent, and preference rules.
- Mission/Missions terminology is correct across UI, API messages, notifications, reports, exports, tests, and docs.
- SQL and migrations are PostgreSQL compatible.
- Relevant unit, integration, RBAC/API, E2E, regression, accessibility, and mobile checks pass.
- Associated customer/product documentation and Docusaurus processing are updated when the user-facing workflow changes.
- No fictional, seeded, fallback, or local-only data is presented as persisted customer state.
Completion Record Template
Add this directly beneath a story before marking it complete:
- Completed: YYYY-MM-DD
- Journey contract: `path`
- UI/entry point: `path or route`
- API/persistence: `controller/service/migration`
- Authorization/scope: `policy and negative test`
- Downstream reconciliation: `affected surfaces and evidence`
- Verification: `commands and result`
- Documentation: `customer/product doc and Docusaurus path`
- Remaining external/manual gates: None
If the final line is not None, the story remains unchecked.
P0: Public Discovery And Account Entry
- US-PUB-001 — Public portal visibility. As a public visitor, I want to browse only public, published Organizations, Programs, Missions, and calendars so private, invite-only, unpublished, canceled, expired, or unrelated information never leaks.
- Completed: 2026-08-09
- Journey contract:
docs/product/journey-contracts/competitive-gap-013-public-portal-visibility.md - Owning repository:
goodnearby-web; coordinated source-of-truth/API repository:aidorbit-web. No WordPress change is required for this closure slice. - UI/entry point: GoodNearby Volunteer routes
/missions,/o/:slug/missions,/o/:slug/missions/:missionSlug, and/o/:slug/calendarconsume the server-filtered GoodNearby public payloads. Legacyaidorbit-web/hubs/:orgSlug/...routes are compatibility/API enforcement surfaces, not the Volunteer product experience. - API/persistence:
PortalControllerdelegates public portal list, detail, and calendar reads toPortalRepository;GoodNearbyRepositoryreads persisted organization, Program, Mission publication, and workflow-state fields. No new persistence schema is needed for this read-only enforcement slice. - Authorization/scope:
PortalRepositoryandGoodNearbyRepositoryrequire public/published visibility, active Program state, and a public Mission workflow state before serializing public list/detail/calendar/feed data.GoodNearbyControllernow has a persisted-data regression that returns 404 for a private direct Mission URL and removes that Mission from its public list, calendar, and feed. Repository regressions deny private, invite-only, unpublished, canceled, and inactive-Program Mission data. - Downstream reconciliation: legacy portal lists, details, calendars, featured Mission surfaces, GoodNearby organization/program lists, details, calendars, and marketplace feed share the public predicates; privacy changes stop exposure rather than changing roster, attendance, hours, or notification state.
- Verification:
php -l src/Repositories/PortalRepository.php;php -l src/Repositories/GoodNearbyRepository.php;php public/vendor/bin/phpunit tests/Repositories/PortalRepositoryTest.php tests/Repositories/GoodNearbyRepositoryTest.php— passed (72 tests, 325 assertions).goodnearby-web npx tsc --noEmit— passed.goodnearby-web npx playwright test tests/e2e/organization-first-public-routes.spec.ts --project=chromium --workers=1— passed (4 tests); the same command with--project=mobile-chrome— passed (4 tests). The GoodNearby runner uses its documented runtime Next server in webpack mode instead of serving the stale staticout/directory.node --check public/success/scripts/sync-development-plan.jsandnpm --prefix public/success run sync:development-plan— passed.npm run docs:checkremains blocked by pre-existing frontmatter/orphan errors in unrelated customer docs. Mock fixtures and legacy AidOrbit browser checks are not counted as public-state proof. - Documentation: updated the journey contract and
docs/customer/explanations/public-portals-vs-private-portals.md; canonical plan sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining external/manual gates: None.
- US-PUB-002 — Public Mission decision information. As a prospective Volunteer, I want to understand a Mission's schedule, location policy, capacity signal, eligibility, requirements, accessibility, and approval rules before committing.
- Completed: 2026-08-09
- Journey contract:
docs/product/journey-contracts/public-mission-decision-information.mdcovers public discovery/qualification, Program Manager publication, scope, workflow display, edge cases, and verification. - Owning repositories:
aidorbit-webowns the program-scoped publication settings, persistence, authorization, and public API;goodnearby-webowns Volunteer-facing public Mission details.aidorbit-wordpressis unchanged because it is marketing/editorial/embedded delivery, not the Volunteer portal. - UI/entry points: AidOrbit Mission Builder's editable Mission GoodNearby visibility panel and the Volunteer Hubs Mission settings can author Public accessibility notes. GoodNearby Volunteer routes
/missions,/o/:slug/missions, and/o/:slug/missions/:missionSlugremain the discovery/detail product experience; the detail route conditionally renders an Accessibility section before signup. AidOrbit Mission Control is not a Volunteer Mission-search surface. - API/persistence: PostgreSQL migration
20260809120000_add_public_mission_accessibility_notes.phpadds nullablemission_publication_settings.public_accessibility_notes;GoodNearbyRepository::updateMissionSettingspersists it and records the existing publication-settings audit event.publicMissionResponseserializes it as public Missionaccessibility.notesalongside existing persisted schedule/shifts, privacy-safe location, capacity, requirements, and signup/approval information. - Authorization/scope: the existing
goodnearby_site.manage_public_missionsupdate path requires the Mission's assigned Program scope before persistence; the focused regression denies an unscoped actor. Public serialization remains behind organization/Program/Mission public and published predicates, active Program state, and public Mission workflow state, so it does not source any Volunteer profile accessibility or health data. - Downstream reconciliation: this is public publication metadata only. It does not mutate eligibility, capacity, registration, roster, attendance, hours, reports, reminders, or approval state; the public detail retains their current backend-derived signals and signup still enforces those states downstream.
- Verification:
php -l src/Repositories/GoodNearbyRepository.php;php -l src/database/migrations/20260809120000_add_public_mission_accessibility_notes.php;php public/vendor/bin/phpunit tests/Repositories/GoodNearbyRepositoryTest.php— passed (50 tests, 216 assertions).npm run build:verify— passed.goodnearby-web npx tsc --noEmit— passed.goodnearby-web npx playwright test tests/e2e/organization-first-public-routes.spec.ts --project=chromium --workers=1— passed (4 tests); the same command with--project=mobile-chrome— passed (4 tests).git diff --check— passed. - Documentation and Docusaurus: added the journey contract; updated
docs/customer/explanations/public-portals-vs-private-portals.md;node --check public/success/scripts/sync-development-plan.jsandnpm --prefix public/success run sync:development-planpassed, syncing this canonical plan topublic/success/docs/development/user-story-development-plan.md.npm run docs:checkstill has the pre-existing unrelated frontmatter/orphan failures inplatform-admin-integration-health.mdandplatform-accounts-manual-provisioning.md. - Remaining external/manual gates: None.
- US-PUB-003 — Public-to-account continuity. As a prospective Volunteer, I want to create and verify my account from a public Mission or GoodNearby page and return to the same registration journey.
- Completed: 2026-08-09
- Journey contract:
docs/product/journey-contracts/public-to-account-continuity.mdcovers discovery, account creation, email verification, sign-in, return, scope, privacy, stale-Mission, capacity, and approval outcomes. - Owning repositories:
goodnearby-webowns Volunteer public Mission CTAs and authentication return UI;aidorbit-webowns persistent Volunteer account/verification state, audit events, and safe continuation enforcement.aidorbit-wordpressis unchanged because it is not the Volunteer portal or account flow. - UI/entry points: the GoodNearby public Mission signup panel routes unauthenticated Volunteers to
/sign-in?redirect=/o/:org/missions/:missionor/sign-up?redirect=/o/:org/missions/:mission. The GoodNearby auth form returns successful credential or social sign-in to that route; AidOrbit Mission Control remains outside Volunteer discovery. - API/persistence:
JwtAuthController::goodNearbyRegisterforces creation of a persistent Volunteer account, verification-token state, volunteer role assignment, and existing registration audit. The GoodNearby registration client sends an explicit verification continuation; the server-generated verification email carries it, and verified Volunteers return to GoodNearby sign-in with the original internal Mission redirect. Account creation alone does not create a registration or alter shift capacity. - Authorization/scope: continuation URLs are normalized against the existing configured GoodNearby/CORS-origin allowlist before use.
verifyEmailsends non-organization accounts only to that allowlisted GoodNearby URL; arbitrary origins fall back to GoodNearby sign-in. Returning Mission signup continues to use existing server-side identity, public visibility, Program eligibility, requirement, capacity, waitlist, and approval checks. - Downstream reconciliation: no registration, roster, capacity, reminder, attendance, hours, report, or confirmation event occurs until the returned Volunteer explicitly signs up. Existing
auth.goodnearby_registerandauth.email_verifiedaudit events retain account lifecycle evidence. - Verification:
php -l src/Http/Controllers/JwtAuthController.php;php public/vendor/bin/phpunit tests/Http/Controllers/JwtAuthControllerTest.php— passed (19 tests, 113 assertions), including persistent GoodNearby Volunteer account/role creation and allowlisted Mission continuation.npm run build:verify— passed.goodnearby-web npx tsc --noEmit— passed after regenerating a malformed ignored.next/dev/typescache through the documented test server.goodnearby-web npx playwright test tests/e2e/organization-first-public-routes.spec.ts --project=chromium --workers=1— passed (4 tests); the same command with--project=mobile-chrome— passed (4 tests), asserting public Mission account CTAs preserve the Mission path. Path-scopedgit diff --check— passed; whole-worktreegit diff --checkremains blocked by unrelated pre-existing whitespace changes. - Documentation and Docusaurus: added the journey contract and updated
docs/customer/goodnearby/goodnearby-setup.md;node --check public/success/scripts/sync-development-plan.jsandnpm --prefix public/success run sync:development-planpassed, syncing the canonical plan topublic/success/docs/development/user-story-development-plan.md.npm run docs:checkremains blocked by pre-existing unrelated frontmatter/orphan failures inplatform-admin-integration-health.mdandplatform-accounts-manual-provisioning.md. - Remaining external/manual gates: None.
- US-PUB-004 — Invitation continuity. As an invited Volunteer, I want an invitation or magic link to preserve the correct Organization, Program, Mission, and intended next action.
- Completed implementation: 2026-08-10 — marked complete at requester direction; required manual runtime validation remains open below.
- Journey contract:
docs/product/journey-contracts/invitation-continuity.md. - Owning repositories:
aidorbit-webowns invitation issue, persistence, scope validation, and audit;goodnearby-webowns/invitationauthentication and continuation.aidorbit-wordpressis unchanged. - UI/entry point:
VolunteerController::inviteVolunteeremails GoodNearby/invitation?token=...; the GoodNearby continuation surface canonicalizes its trailing-slash route back to that token-scoped path before redirecting unauthenticated visitors through sign-up/sign-in or rendering explicit loading, unavailable, and confirmed states. After confirmation, Review secure Mission access routes to/invitation/access, not an unscoped public Mission URL. Existing accounts can request an invitation-specific Email magic link from GoodNearby sign-in. The Program Manager Roster invite dialog loads persisted invitations after reload, available Missions from the selected authorized Program, supports thereview/apply/registeraction choices, and exposes scoped Revoke and Reissue controls. It deliberately says that an invitation does not register the Volunteer. - API/persistence: PostgreSQL migration
20260809123000_create_volunteer_invitation_handoffs.phppersists only a SHA-256 token hash, recipient email, Organization/Program/Mission scope, action, issuer, expiry, revoke, and consume fields.VolunteerControllerissues a 14-day handoff andVolunteerInvitationHandoffController::consumeatomically marks it consumed after server validation.GET /api/public/goodnearby/invitations/activederives secure display context from those consumed rows; no new client-held scope is persisted. - Authorization/scope: issue, list, revoke, and reissue require assigned Program authority. The list derives authorized Program IDs from Organization Admin/platform authority, Program Staff assignments, or Program-scoped role grants, and never serializes sibling-Program recipient data. Mutating endpoints load the persisted handoff by current Organization and re-check its Program before mutation. A magic-link GoodNearby redirect is permitted only when the hashed handoff is active and bound to the requested email; the Mission Control callback accepts only that protected GoodNearby invitation return, not arbitrary external URLs.
GET /api/public/goodnearby/invitations/activerequires authentication and returns only the caller's non-revoked, unexpired consumed handoffs after reloading current Program/Mission state.SignupControllerrejectsinvite-onlyMission signup without an active handoff for the same authenticated user and Mission, both before and inside the capacity transaction. The Mission picker uses the already scopedOpportunityControllerlist; issue independently rejects a Mission outside that Program or in a non-available state. Consume requires a JWT-authenticated user whose email equals the persisted recipient; expired, revoked, consumed, missing Program, and non-public/stale Mission handoffs fail closed. Raw scope is never accepted from browser parameters or storage. - Downstream reconciliation: consumption neither creates a registration nor changes capacity, roster, attendance, hours, reports, or notifications. The focused persistence regression verifies that
signupsremains empty and Mission-shift capacity remains unchanged after consumption. It records issue/consume audit events; the destination must still apply server-side signup/eligibility/capacity/approval enforcement. - Verification:
php -l src/Http/Controllers/VolunteerInvitationHandoffController.php;php -l src/Http/Controllers/VolunteerController.php;php -l src/Http/Controllers/MagicLinksController.php;php -l src/Http/Controllers/SignupController.php;php -l src/bootstrap.php; focused handoff/auth suite — passed (55 tests, 363 assertions), including recipient-bound active-handoff redirect allowance, mismatch denial, canceled-Mission fail-closed-without-consumption, no signup/capacity mutation, authenticated-user-only active invitation contexts, and invite-only signup entitlement binding. Fullphp public/vendor/bin/phpunit tests/Http/Controllers/SignupControllerTest.php— passed (58 tests, 221 assertions), including direct403 invitation_requiredwith no signup for an invite-only Mission without a consumed handoff.npm run build:verify— passed.goodnearby-web npx tsc --noEmit— passed. With GoodNearby served by Windows-native Node at127.0.0.1:3100,npx playwright test tests/e2e/volunteer-workspace-routes.spec.ts --config=playwright.dev.config.ts --project=chromium --workers=1 --grep "preserves an invitation handoff"— passed (1 test), and the same command with--project=mobile-chrome— passed (1 test), including the protected/invitation/accessview. Those browser assertions intercept application API calls; the PHP suite above supplies persistence/RBAC evidence. Path-scopedgit diff --check— passed; whole-worktree check is blocked by unrelated pre-existing whitespace changes. - Documentation: updated
docs/customer/goodnearby/goodnearby-setup.md; canonical Docusaurus sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining implementation gap: None in the checked-in slice; controller, persistence, and browser-contract evidence is recorded above.
- Remaining external/manual gates: Configure and run the AidOrbit application service with its PostgreSQL-backed integration environment, then execute the invite-only handoff, GoodNearby portal, signup, and capacity flow without intercepted API calls. No local AidOrbit service was listening on ports 8000 or 8080 during verification.
- US-PUB-005 — Safe public gallery and impact. As a public visitor, I want to view approved public media and privacy-safe impact information without seeing private people, requirements, or operational records.
- Completed: 2026-08-10
- Journey contract:
docs/product/journey-contracts/goodnearby-public-gallery-preview-and-full-page.mdcovers the Public Visitor/Program Manager journeys, display-only workflow state, approval safeguards, privacy edge cases, and test plan. - Owning repositories:
goodnearby-webowns the Volunteer-facing organization and Program gallery routes;aidorbit-webowns the persisted Media Library approval data and server-filtered public payload.aidorbit-wordpressis unchanged because it is not a GoodNearby gallery surface. - UI/entry points: GoodNearby organization and Program profiles render a six-image
PeopleGallerypreview with a reachable full-gallery route at/o/:slug/galleryor/o/:slug/programs/:programSlug/gallery; the keyboard-operable gallery viewer exposes image alt text and lazy-loads non-primary images. Empty approval-safe data renders no gallery rather than a seeded or legacy substitute. - API/persistence:
GoodNearbyRepository::publicOrganizationResponseand::publicProgramResponseread persistedmedia_assets, versions, and delivery variants throughMediaLibraryRepository::listPublic. The display-only slice creates no registrations, attendance, hours, reports, exports, notifications, or audit events. Public impact remains the organization-controlled publicimpactStatement, not Volunteer, roster, requirements, or operational data. - Authorization/scope: the unauthenticated query remains organization/Program scoped and returns only
public_approved, approved, consent-safe, non-minor,no_minors_visible, non-archived, publicly deliverable assets. Legacy Mission photos and configured external gallery URLs lack this approval record and are omitted; Media Library titles/descriptions are staff metadata and are not serialized as public captions.MediaLibraryControllerTestproves public API filtering for draft, minor-related, unknown-consent, and unreviewed assets;GoodNearbyRepositoryTestproves legacy-photo exclusion and approved-asset-only output. - Downstream reconciliation: this display-only publication slice does not mutate Mission, registration, attendance, hours, capacity, roster, dashboard, report, export, notification, or audit state. Organization and Program previews and their full-gallery routes consume the same filtered payload, so an asset cannot appear in one public gallery surface but not the other.
- Verification:
php -l src/Repositories/GoodNearbyRepository.php— passed.php public/vendor/bin/phpunit tests/Repositories/GoodNearbyRepositoryTest.php tests/Http/Controllers/MediaLibraryControllerTest.php— passed (73 tests, 264 assertions).npm run build:verify— passed.goodnearby-web npx tsc --noEmit— passed.goodnearby-web npx playwright test tests/e2e/organization-first-public-routes.spec.ts --project=chromium --workers=1 --reporter=list— passed; the same route suite with--project=mobile-chrome --workers=1— passed. Browser reachability is separate from the PHP persistence/authorization evidence and does not rely on its mock API fixture. Path-scopedgit diff --check— passed. - Documentation and Docusaurus: updated
docs/customer/goodnearby/goodnearby-setup.mdand the gallery journey contract; canonical plan sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining external/manual gates: None.
- US-PUB-006 — Accessible mobile discovery. As a public visitor, I want Mission discovery and account entry to work on a phone, with keyboard and assistive technology, without device-only controls or horizontal overflow.
- Implemented and verification-recorded: 2026-08-10. The checkbox remains open because the manual assistive-technology/device gate below has not been performed.
- Journey contract:
docs/product/journey-contracts/public-mobile-discovery-accessibility.md - Owning repositories:
goodnearby-webowns public Mission discovery and account-entry UI;aidorbit-webowns the existing filtered public payload and AidOrbit-backed account/continuation boundary.aidorbit-wordpressis unchanged because it does not own the Volunteer portal. - UI/entry points: GoodNearby's desktop and responsive public navigation now expose Find Missions at
/missions. The mobile menu has an explicit control relationship and returns focus to its trigger on Escape. A visible-on-focus skip link targets the shared main-content wrapper./missionsretains a labeled text search and manual city/ZIP filter alongside optional device location;/sign-inand/sign-upretain labeled account fields and the internal Mission return flow. - API/persistence: no endpoint, schema, or state mutation was added. This display/entry slice continues to use the server-filtered public Mission payload and existing AidOrbit account creation/verification/continuation paths; account entry does not create registrations or consume capacity.
- Authorization/scope: no browser-provided scope is newly trusted. Existing public/published/active Program filtering and safe internal continuation enforcement were re-run in
GoodNearbyRepositoryTestandJwtAuthControllerTest(69 tests, 328 assertions). - Downstream reconciliation: no Mission, Program, registration, roster, capacity, attendance, hours, dashboard, report, export, notification, or audit state changes. Empty search, denied/unavailable location, and account success/error states are explicit; location failure announces the manual city/ZIP fallback instead of requiring a device-only control.
- Verification:
goodnearby-web npx tsc --noEmit— passed.goodnearby-web npx playwright test tests/e2e/organization-first-public-routes.spec.ts --project=chromium --workers=1 --reporter=list— passed (5 tests), including skip target, responsive Mission navigation, Escape focus return, keyboard-labeled controls, and overflow checks. The same command with--project=mobile-chrome— passed (5 tests).php public/vendor/bin/phpunit tests/Repositories/GoodNearbyRepositoryTest.php tests/Http/Controllers/JwtAuthControllerTest.php— passed (69 tests, 328 assertions).npm run build:verify— passed. - Documentation: added the journey contract and updated
docs/customer/goodnearby/goodnearby-setup.md;node --check public/success/scripts/sync-development-plan.jsandnpm --prefix public/success run sync:development-planpassed, syncing the canonical plan topublic/success/docs/development/user-story-development-plan.md.npm run docs:checkremains blocked by pre-existing missing frontmatter/orphan errors in unrelated platform integration-health and manual-provisioning customer docs. - Remaining external/manual gates: Use a physical phone and supported screen reader (VoiceOver or TalkBack) to smoke the responsive menu, skip link, text/ZIP search fallback, public Mission CTA, and account error/success announcements. Do not check this story until that evidence is captured.
P0: Volunteer Lifecycle
- US-VOL-001 — Account and identity. As a Volunteer, I want to register, verify contact details, sign in, recover access, use permitted social or passwordless login, and manage MFA/account security.
- Implemented and verification-recorded: 2026-08-10. The checkbox remains open because live OAuth-provider and transactional-email validation has not been performed.
- Journey contract:
docs/product/journey-contracts/volunteer-account-and-identity.md - Owning repositories:
aidorbit-webowns identity persistence, verification, password recovery, magic-link, social-handoff, MFA, session authorization, and Account Settings.goodnearby-webowns Volunteer-facing account entry and safe return UI.aidorbit-wordpressis unchanged because it does not own Volunteer authentication. - UI/entry points: GoodNearby
/sign-upand/sign-inexpose credential, Google/Facebook, recovery, verification, invitation-passwordless, and MFA-challenge states; public Mission CTAs retain their internal return route. Authenticated AidOrbit/mission-control/account/settingsis reachable from Account Settings navigation and has a Security & Login tab for verification state, connected sign-in method, eligible password updates, and authenticator setup/disable. - API/persistence:
JwtAuthControllerpersists Volunteer account/role/verification and GoodNearby credential, social, MFA, and session flows;MagicLinksControllerpersists hashed single-use magic links and audit events;AccountSettingsControllerderives the authenticated user and persists self-only email, password, and MFA changes. No account action creates a Mission registration or capacity claim. - Authorization/scope: public bootstrap endpoints issue only the resulting caller session; account settings routes derive the user from the authenticated session and accept no target account ID.
MfaServicerequires the current password before optional MFA disable and rejects disable under a required-MFA policy. Focused tests cover current-user scope, unauthenticated handling, duplicate-email rejection, social-linked password mutation rejection, and MFA lifecycle persistence. - Downstream reconciliation: authentication determines which self-scoped Volunteer dashboard/API data may load. Account identity and security changes do not mutate Programs, Missions, registrations, capacity, rosters, attendance, hours, reports, exports, or notifications; existing verification/recovery/magic-link/audit lifecycle records remain the only downstream effects.
- Verification:
php public/vendor/bin/phpunit tests/Http/Controllers/AccountSettingsControllerTest.php tests/Http/Controllers/JwtAuthControllerTest.php tests/Http/Controllers/MagicLinksGoodNearbyInvitationTest.php tests/Auth/PermissionsTest.php— passed (68 tests, 478 assertions), including Volunteer MFA enroll/confirm/disable persistence.npm run build:verify— passed.goodnearby-web npx tsc --noEmit— passed.goodnearby-web npx playwright test tests/e2e/volunteer-workspace-routes.spec.ts --config=playwright.dev.config.ts --project=chromium --workers=1 --grep "supports account recovery|shows sign-in and account creation CTAs|preserves an invitation handoff" --reporter=list— passed; the same command with--project=mobile-chrome— passed. Browser requests are mocked only at the GoodNearby API boundary; PHP tests above supply persistence/authorization evidence. - Documentation: added the journey contract and updated
docs/customer/troubleshooting/login-issues.md;node --check public/success/scripts/sync-development-plan.jsandnpm --prefix public/success run sync:development-planpassed, syncing the canonical plan topublic/success/docs/development/user-story-development-plan.md.npm run docs:checkremains blocked by pre-existing missing frontmatter/orphan errors in unrelated platform integration-health and manual-provisioning customer docs. - Remaining external/manual gates: Configure the production Google/Facebook provider credentials and callbacks, then execute an unmocked GoodNearby social sign-in and transactional verification/reset/magic-link delivery to a controlled mailbox. Do not check this story until that evidence is captured.
- US-VOL-002 — Profile and preferences. As a Volunteer, I want to maintain my name, bio, contact details, emergency contact, locale, accessibility settings, communication preferences, and other self-service profile fields.
- Implemented and verification-recorded: 2026-08-10. The checkbox remains open pending a real authenticated cross-device profile/preferences smoke and consolidated controller evidence for every profile field.
- Journey contract:
docs/product/journey-contracts/volunteer-profile-and-preferences.md - Owning repositories:
aidorbit-webowns profile/preference persistence and authorization;goodnearby-webowns the authenticated Volunteer profile entry at/me/profile.aidorbit-wordpressis unchanged. - UI/entry points: GoodNearby
/me/profileexposes profile/emergency/custom-field and notification controls. AidOrbit/mission-control/account/settings?tab=preferencesexposes locale and accessibility controls; PersonalizationContext now hydrates and saves them through the authenticated self-preference API instead of presenting browser storage as durable account state. - API/persistence:
VolunteerController::getMe/updateMepersists self profile and primary emergency contact;NotificationsControllerpersists current-user notification preferences;UserPreferencesControllerpersists Account Settings personalization underpersonalization.v1. - Authorization/scope: profile and preference endpoints derive the authenticated user; profile update accepts no target Volunteer ID. Existing custom-field policy keeps staff-only/read-only fields out of Volunteer mutation, and public portals do not serialize Volunteer profile data.
- Downstream reconciliation: profile/readiness and communication preferences use persisted self facts. This slice does not mutate Mission/registration/capacity/roster/attendance/hours/report/export state or bypass message consent rules.
- Verification:
npm test -- app/src/context/__tests__/PersonalizationContext.test.tsx— passed;npm run build:verify— passed. Focused source/test review confirms existing profile, emergency-contact, notification, and GoodNearby workspace persistence paths; a full live API session is still required below. - Documentation: added the journey contract and updated
docs/customer/troubleshooting/login-issues.md; canonical Docusaurus sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining external/manual gates: Sign in on two real browsers/devices, change profile/contact/emergency, notification, locale, and accessibility values, reload/sign in on the second device, and confirm persisted values and scoped privacy behavior. Do not check this story until captured.
- US-VOL-003 — Program discovery and membership. As a Volunteer, I want to discover Programs, apply or join where required, and see pending, approved, rejected, inactive, and next-action states.
- Implemented and verification-recorded: 2026-08-10. The checkbox remains open pending a real authenticated Volunteer-to-staff-decision smoke and browser E2E environment recovery.
- Journey contract:
docs/product/journey-contracts/volunteer-program-discovery-and-membership.md - Owning repositories:
goodnearby-webowns public Program discovery, applications, and Volunteer status UI;aidorbit-webowns persisted relationships, state transitions, authorization, audit, and notifications.aidorbit-wordpressis unchanged. - UI/entry points: GoodNearby public Program pages use
ProgramApplicationPanelfor sign-in/create-account return, application, duplicate-pending, approved, and in-progress states. Authenticated/me/programsand/me/applicationsshow distinct Program relationships, exact status badges, and next actions; inactive membership now explicitly directs the Volunteer to the Program before any Mission access or reapplication. - API/persistence:
POST /api/v1/programs/{id}/applicationspersists the authenticated Volunteer inuser_programs, notes, audit events, and scoped staff notifications.GET /api/v1/volunteers/program-access?email=...returns only the caller's latest relationship per Program. The reader now retainsinactive,on-leave, andarchivedmembership as the Volunteer-facinginactivestate instead of omitting it. - Authorization/scope:
VolunteerController::programAccessrequires a session and rejects any email except the session user's.ProgramController::applyderives the Volunteer from the session; accept/decline requires the matching Program'sprogram_applications.accept/program_applications.declineauthority. Focused regressions cover self-email denial, current-organization filtering, and private sibling-Mission denial for an unapproved Program. - Downstream reconciliation: application submission/decision writes scoped audit and notification records; pending, waitlisted, rejected, invited, and inactive states do not count as approved Program access or unlock private Missions. This slice does not create a registration, capacity claim, attendance, hours, report, or export record.
- Verification:
php public/vendor/bin/phpunit tests/Http/Controllers/VolunteerControllerTest.php --filter 'testProgramAccess|testMissionsDiscoveryShowsPrivatePublishedMissionsOnlyForApprovedProgramVolunteers'— passed (7 tests, 36 assertions).php public/vendor/bin/phpunit tests/Http/Controllers/ProgramControllerTest.php --filter 'testApplyCreatesPendingMembershipAndAuditRecord|testApplyAllowsVolunteerToReapplyAfterRejection|testApplyPreservesWaitlistedApplicationState|testApplyAcceptsInvitedApplicationState'— passed (4 tests, 27 assertions).goodnearby-web npx tsc --noEmit— passed. The targeted GoodNearby Playwright state test is currently blocked by the local Next server accepting a listener but not responding to loopback requests in this environment; its failure is not counted as UI proof. - Documentation: added the journey contract and updated
docs/customer/troubleshooting/volunteer-cannot-register.md; canonical Docusaurus sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining external/manual gates: Run an unmocked Volunteer application through a scoped Program Staff decision and confirm pending, approved, rejected, inactive, and next-action states on GoodNearby desktop and phone. Restore the local browser-test server loopback path and capture the targeted Chromium/mobile E2E results. Do not check this story until both are captured.
- US-VOL-004 — Mission discovery and recommendations. As a Volunteer, I want to find eligible Missions by location, schedule, cause, interests, skills, accessibility, and availability.
- US-VOL-005 — Favorites and return discovery. As a Volunteer, I want to favorite Organizations, Programs, and Missions and receive relevant, preference-aware return recommendations.
- US-VOL-006 — Skills and availability. As a Volunteer, I want to add, rate, reorder, and update skills and recurring or ad-hoc availability so matching remains accurate.
- Implemented and verification-recorded: 2026-08-10. The checkbox remains open pending an authenticated multi-organization staging-browser smoke that proves the active organization context is preserved for both availability reads/saves and Mission recommendations.
- Journey contract:
docs/product/journey-contracts/us-vol-006-skills-and-availability.md - Owning repository:
aidorbit-webowns the authenticated Volunteer self-service UI, skill/availability persistence, matching inputs, and authorization.goodnearby-webandaidorbit-wordpressare unchanged because this story has no public or embedded surface. - UI/entry points:
/mission-control/my/profile?tab=skillsand/mission-control/volunteer/skillsprovide skill add, proficiency and experience updates, keyboard-accessible reorder controls, custom-skill moderation status, and recurring or ad-hoc availability planning. - Authorization and data: skills use the existing self-or-authorized-staff
VolunteerControllerAPIs; availability uses self-or-authorized-staffAvailabilityControllerAPIs. Availability reads/saves and Mission recommendation reads sendX-AidOrbit-Org; their tenant-specific React Query keys prevent a context switch from reusing or overwriting another organization’s state. Scoped recommendations bypass the legacy user-only cache and only select Missions from the active organization. - Downstream reconciliation: saved skill priority, proficiency, and approved custom-skill state feed skill matching; recurring and ad-hoc windows feed availability matching. These updates do not create or alter a Mission registration, attendance, hours, commitment, notification, or report record.
- Documentation: added the journey contract and
docs/customer/volunteers/skills-and-availability.md; canonical Docusaurus sync target ispublic/success/docs/development/user-story-development-plan.md. - Remaining external/manual gate: With a Volunteer who belongs to two organizations, save a recurring and an ad-hoc window in each active organization, switch contexts and reload, then verify that each context shows only its own windows and that Mission recommendations contain only active-organization Missions. Do not check this story until this is captured.
- US-VOL-007 — Guided onboarding. As a Volunteer, I want saved onboarding progress across profile, training, certifications, waivers, guardian consent, and readiness tasks.
- US-VOL-008 — Requirements and renewals. As a Volunteer, I want to sign agreements, upload permitted credentials, complete training, monitor expiration, and understand exactly how to resolve missing or rejected requirements.
- US-VOL-009 — Required custom fields. As a Volunteer, I want self-service required profile fields to identify the missing value and staff-maintained fields to identify the responsible staff action.
- US-VOL-010 — Mission shift registration. As a Volunteer, I want to select a Mission shift or role and see whether I am confirmed, pending approval, waitlisted, full, blocked, rejected, canceled, or in conflict.
- Implementation recorded: 2026-08-10. Mission detail now retains persisted rejected and canceled shift-registration states from the authenticated backend payload and renders them as explicit inactive badges and next actions. The existing signup API remains the authority for confirmed, pending approval, waitlisted, full, blocked, and schedule-conflict outcomes, with transactional capacity, self/program scope, requirements, notifications, and audit logging.
- Journey contract:
docs/product/journey-contracts/us-vol-010-mission-shift-registration.md. - Owning repository:
aidorbit-web;goodnearby-webandaidorbit-wordpressare unchanged because the change is in the authenticated Mission registration state consumer. - Verification:
npm test -- app/src/hooks/__tests__/useMissionDiscovery.test.tsx— passed (3 tests);php public/vendor/bin/phpunit tests/Http/Controllers/VolunteerRegistrationJourneyTest.php tests/Http/Controllers/SignupControllerTest.php— passed (61 tests, 279 assertions);npm run build:verify— passed. - Remaining external/manual gate: On deployed staging, use an eligible Volunteer to submit a confirmed, approval-required, full/waitlist, blocked-requirements, and conflicting-shift registration, then have staff reject and cancel separate registrations. Verify the volunteer’s Mission detail, schedule, roster, capacity, and notification state all match the persisted result. Keep this story unchecked until captured.
- US-VOL-011 — Waitlist and promotion. As a Volunteer, I want to join a full shift's waitlist, retain my position according to policy, and receive an accurate promotion or expiration notice.
- Implementation recorded: 2026-08-10.
signupsnow stores a durable waitlist position and optional policy-derived expiration timestamps; cancellation-triggered automatic promotion uses that position rather than a mutable signup timestamp, and expiration changes status toexpiredwith scoped notification and audit evidence. - Journey contract:
docs/product/journey-contracts/us-vol-011-waitlist-and-promotion.md. - Owning repository:
aidorbit-web;goodnearby-webandaidorbit-wordpressare unchanged because the story is an authenticated Mission-registration lifecycle. - Verification:
php public/vendor/bin/phpunit tests/Http/Controllers/SignupCapacityWaitlistConcurrencyTest.phppassed (5 tests, 25 assertions);php public/vendor/bin/phpunit tests/Http/Controllers/SignupControllerTest.php tests/Http/Controllers/VolunteerRegistrationJourneyTest.phppassed (61 tests, 279 assertions);npm run build:verifypassed.npm run docs:checkremains blocked by existing malformed/orphaned customer documents outside this story. - Remaining external/manual gate: On deployed staging, configure a full Mission shift with a waitlist expiration policy, add two eligible Volunteers, cancel the confirmed registration, then verify first-in promotion, schedule/roster capacity reconciliation, and the promoted or expired in-app notification. Keep this story unchecked until captured.
- Implementation recorded: 2026-08-10.
- US-VOL-012 — Registration change or cancellation. As a Volunteer, I want to cancel or change my registration within policy so capacity, waitlists, reminders, rosters, and reports update correctly.
- US-VOL-013 — Schedule and calendar. As a Volunteer, I want one current schedule for confirmed, pending, and waitlisted commitments and optional Google, Outlook, or Apple calendar synchronization.
- US-VOL-014 — Mission preparation. As a Volunteer, I want current location, staging, travel, accessibility, weather, safety, coordinator, and preparation instructions before arrival.
- US-VOL-015 — Check-in and checkout. As a confirmed Volunteer, I want accessible self, QR, kiosk, manual, or permitted geofenced check-in and checkout with clear fallback behavior.
- Implemented and verification-recorded: 2026-08-10. Self-service checkout now supports the same JWT-authenticated Volunteer identity as self-service check-in; the existing QR/kiosk, authorized staff/manual, permitted geofence, duplicate-safe, correction, hours, and accessible fallback paths were revalidated.
- Journey contract:
docs/product/journey-contracts/us-vol-015-check-in-and-checkout.md - Owning repository:
aidorbit-web;goodnearby-webandaidorbit-wordpressare unchanged. - Verification:
php public/vendor/bin/phpunit tests/Http/Controllers/AttendanceControllerTest.php tests/Http/Controllers/KioskControllerTest.php— passed (19 tests, 56 assertions);php public/vendor/bin/phpunit tests/Services/GeofenceAttendanceServiceTest.php— passed (2 tests, 16 assertions);npm test -- app/src/pages/public/__tests__/KioskCheckInPage.test.tsx— passed (4 tests);npm run build:verify— passed. - Remaining external/manual gate: Perform an authenticated Volunteer self-service checkout and a staff kiosk/manual checkout against a deployed staging environment before asserting production readiness.
- US-VOL-016 — Attendance exceptions. As a Volunteer, I want missing checkout, duplicate action, poor connectivity, incorrect attendance, and no-show states explained with a correction path.
- US-VOL-017 — Hours submission and evidence. As a Volunteer, I want to submit permitted on-platform or off-platform hours, plus-one information, notes, and evidence without creating duplicates.
- US-VOL-018 — Hours review and correction. As a Volunteer, I want pending, approved, rejected, adjusted, and locked hours shown with reasons and a correction or appeal path.
- US-VOL-019 — Impact and recognition. As a Volunteer, I want accurate impact totals, milestones, badges, recognition, and contribution history based only on approved facts.
- US-VOL-020 — Verified service artifact. As a Volunteer, I want a résumé, certificate, transcript, or service record that an authorized school, court, employer, or other verifier can validate through a privacy-safe link.
- US-VOL-021 — Post-Mission response. As an attended Volunteer, I want to submit feedback, reflection, outcome, safeguarding, or incident forms tied to the correct Mission and Program.
- US-VOL-022 — Communications. As a Volunteer, I want scoped messages, confirmations, reminders, schedule changes, cancellations, requirement notices, and post-Mission follow-up through my permitted channels.
- US-VOL-023 — Multi-Program experience. As a Volunteer, I want each Program's membership, requirements, Missions, registrations, communications, and hours kept distinct while my shared profile stays consistent.
- US-VOL-024 — Teams and service learning. As a Volunteer, I want to manage my authorized teams, cohorts, service-learning placements, assigned tasks, and group commitments.
- US-VOL-025 — Data rights and account exit. As a Volunteer, I want to export my personal data, withdraw optional consent, leave permitted Programs, and request account or data deletion with legal-retention exceptions explained.
- US-VOL-026 — Help and escalation. As a Volunteer, I want contextual help, support contacts, reimbursement guidance, safety escalation, and a clear next-best action when a workflow is blocked.
P0: Program Manager Lifecycle
- US-PM-001 — Assigned Program context. As a Program Manager, I want to select only an assigned Program and have every route, API, query, message, report, export, and deep link retain that scope.
- US-PM-002 — Program operating profile. As a Program Manager, I want to view and edit only permitted Program objectives, locations, schedule policy, capacity, use-case packs, and Program-scoped vertical settings.
- US-PM-003 — Mission creation. As a Program Manager, I want to create a draft Mission manually, from a template, from a vertical starter, or from an authorized AI/import workflow.
- US-PM-004 — Mission lifecycle. As a Program Manager, I want to edit, publish, unpublish, cancel, archive, unarchive, duplicate, and inspect the activity history of an assigned-Program Mission.
- US-PM-005 — Mission recurrence. As a Program Manager, I want to define a recurrence rule, preview generated occurrences, update the series safely, and respect Program lifecycle policy.
- US-PM-006 — Mission location and weather. As a Program Manager, I want complete address autocomplete, venue details, map boundaries, and weather/safety guidance while planning and operating a Mission.
- US-PM-007 — Shift, role, and capacity design. As a Program Manager, I want to create shifts and roles with time, capacity, eligibility, training, approval, waitlist, and assignment rules.
- US-PM-008 — Registration queue. As a Program Manager, I want to review pending registrations and approve, reject, request changes, or assign a permitted role without representing pending users as confirmed.
- US-PM-009 — Capacity and waitlists. As a Program Manager, I want transactional capacity, role limits, waitlist visibility, manual promotion controls, and policy-based automatic promotion.
- US-PM-010 — Requirement configuration. As a Program Manager, I want one Program-scoped source workspace for waivers, qualifications, training, certifications, background checks, readiness forms, and custom required fields.
- US-PM-011 — Requirement review. As a Program Manager, I want to approve, reject, request changes, waive, expire, or revoke requirements within my Program and sensitive-document authority.
- US-PM-012 — Volunteer roster. As a Program Manager, I want a scoped roster with safe profile fields, readiness, registration, assignment, availability, attendance, hours, communications, and performance history.
- US-PM-013 — Assignments and staffing. As a Program Manager, I want to match and assign eligible Volunteers, expose staffing gaps, contact replacements, and prevent incompatible or overlapping assignments.
- US-PM-014 — Day-of action center. As a Program Manager, I want today's Missions, staffing risks, requirement blockers, check-in status, incidents, and urgent communications in one scoped workspace.
- US-PM-015 — Check-in operations. As a Program Manager, I want to launch authorized kiosk or QR workflows and process check-in, checkout, walk-ins, no-shows, duplicates, and poor-connectivity retries.
- US-PM-016 — Attendance corrections. As a Program Manager, I want to correct attendance and missing checkout with a reason, permission check, audit event, and hours/report reconciliation.
- US-PM-017 — Hours approval. As a Program Manager, I want to approve, reject, correct, or lock assigned-Program hours with reasons and consistent Volunteer, report, export, and impact totals.
- US-PM-018 — Scoped communications. As a Program Manager, I want recipient previews and consent-aware email, SMS, push, and in-app updates for selected Program, Mission, registration, readiness, or attendance audiences.
- US-PM-019 — Communication lifecycle. As a Program Manager, I want templates, scheduled delivery, reminders, cancellation suppression, delivery status, retries, and immutable communication history.
- US-PM-020 — Incidents and safeguarding. As a Program Manager, I want to record, triage, restrict, escalate, and report Mission incidents without exposing sensitive narratives to unauthorized users.
- US-PM-021 — Program portal management. As a Program Manager, I want to preview and manage permitted Program GoodNearby branding, content, navigation, visibility, featured Missions, and publication state.
- US-PM-022 — Media library. As a Program Manager, I want one scoped media library for Missions, GoodNearby pages, communications, badges, and galleries with visibility, alt text, moderation, and batch assistance.
- US-PM-023 — WordPress integration. As a Program Manager, I want trusted plugin guidance and user-scoped credentials so a website administrator can embed authorized public content without broad secrets.
- US-PM-024 — Reporting and exports. As a Program Manager, I want scoped operational, registration, readiness, attendance, hours, communication, incident, and impact reports with governed exports.
- US-PM-025 — AI-assisted operations. As a Program Manager, I want plan- and permission-aware Copilot, schedule, outreach, risk, report, and Mission drafting assistance with previews before mutations.
- US-PM-026 — Delegated Mission duties. As a Program Manager, I want to delegate limited Mission-day responsibilities without granting Organization-wide or sibling-Program authority.
P0: Program Staff And Check-In Lead
- US-PS-001 — Focused assigned work. As Program Staff, I want a dashboard of today's assigned-Program duties without broad Program Manager or Organization Admin controls.
- US-PS-002 — Minimum roster access. As a Check-In Lead, I want only the assigned Mission roster and minimum permitted Volunteer information needed for day-of operations.
- US-PS-003 — Limited kiosk launch. As a Check-In Lead, I want to launch an authorized kiosk or QR session without receiving unrelated Program administration access.
- US-PS-004 — Day-of attendance actions. As authorized Program Staff, I want to check Volunteers in and out, mark no-shows, and record eligible walk-ins without duplicate attendance or hours.
- US-PS-005 — Offline reconciliation. As Program Staff, I want pending offline attendance actions, retries, conflicts, and reconciliation state made visible and safe.
- US-PS-006 — Exception escalation. As Program Staff, I want to escalate requirements, safety, attendance, Volunteer questions, and missing-checkout exceptions to an authorized manager.
- US-PS-007 — Read-only readiness. As Program Staff, I want safe readiness status for assigned work while requirement decisions and sensitive documents remain separately permissioned.
- US-PS-008 — Scoped communication. As authorized Program Staff, I want to message the permitted Mission audience and see delivery history without accessing sibling Programs.
- US-PS-009 — Recognition recommendation. As Program Staff, I want to recommend recognition or a thank-you follow-up based on verified service without directly changing governed awards.
P0: Organization Administration And Governance
- US-ORG-001 — First-value organization launch. As an Organization Admin, I want a guided path from organization setup through requirements, GoodNearby presence, first Program, assigned manager, and first published Mission.
- US-ORG-002 — Organization profile and branding. As an Organization Admin, I want to manage legal identity, locale, timezone, branding, public profile, and governed data-sharing settings.
- US-ORG-003 — Program lifecycle. As an Organization Admin, I want to create, duplicate, pause, archive, and govern Programs without performing normal Program Manager operations by default.
- US-ORG-004 — Program Manager assignment. As an Organization Admin, I want to assign managers and staff to Programs with explicit scoped roles, effective dates, and audit history.
- US-ORG-005 — Staff lifecycle and MFA. As an Organization Admin, I want to invite, suspend, reactivate, and remove organization staff and enforce appropriate authentication policy.
- US-ORG-006 — Custom roles and access review. As an Organization Admin, I want to define permitted scoped roles, review grants and overrides, and revoke risky or stale access.
- US-ORG-007 — Requirements governance. As an Organization Admin, I want to create and version organization-level waiver, qualification, training, background-check, custom-field, and readiness policies while allowing safe Program overrides.
- US-ORG-008 — Volunteer governance. As an Organization Admin, I want cross-Program Volunteer application, status, duplicate-record, retention, privacy, and escalation controls appropriate to my organization.
- US-ORG-009 — Organization communications. As an Organization Admin, I want governed announcements, templates, audiences, defaults, delivery status, and audit history across authorized Programs.
- US-ORG-010 — Organization reporting. As an Organization Admin, I want reconcilable cross-Program dashboards, reports, scheduled reports, saved views, and sensitive-field-aware exports.
- US-ORG-011 — Data privacy operations. As an Organization Admin, I want inventory, retention, consent, access/export, correction, and deletion-request workflows that remain tenant scoped and audited.
- US-ORG-012 — Billing and entitlements. As an Organization Admin or Billing Representative, I want to understand plan, price, Active Volunteer and Program capacity, staff limits, feature entitlements, usage, renewal, and Stripe-hosted actions.
- US-ORG-013 — Integrations. As an Organization Admin, I want to configure permitted providers, API credentials, webhooks, accounting/reporting connections, and integration health without exposing secrets.
- US-ORG-014 — GoodNearby organization site. As an Organization Admin, I want to govern organization-wide GoodNearby branding, Programs, pages, navigation, media, publication, and public visibility.
- US-ORG-015 — Domain lifecycle. As an Organization Admin, I want to configure an entitled subdomain or custom domain and understand DNS, verification, provisioning, SSL, active, and failure states.
- US-ORG-016 — Vertical configuration. As an Organization Admin, I want to opt individual Programs into approved vertical profiles and use-case packs without changing sibling Programs or the core model.
- US-ORG-017 — Import and migration. As an Organization Admin, I want to preview, validate, import, deduplicate, and reconcile existing people, Programs, Missions, hours, and configuration safely.
- US-ORG-018 — Audit and compliance oversight. As an Organization Admin, I want to review sensitive changes, access, exports, publications, requirement exceptions, and remediation state inside my tenant.
P1: Platform Administration, Billing, And Support
- US-PLAT-001 — Customer provisioning. As a Platform Admin, I want to create a customer Organization, initial Organization Admin, plan, trial, and valid login handoff.
- US-PLAT-002 — Customer record. As authorized Platform Staff, Support, or Billing personnel, I want one scoped customer record that separates customer lifecycle, support, integration health, and Stripe billing state.
- US-PLAT-003 — Platform staff lifecycle. As a Platform Admin, I want to invite, scope, suspend, reactivate, and audit internal staff accounts.
- US-PLAT-004 — Global settings. As a Platform Admin, I want to govern platform branding, environment settings, feature flags, integrations, and safe defaults.
- US-PLAT-005 — Navigation and persona configuration. As a Platform Admin, I want to publish role-aware navigation and dashboard defaults without exposing unauthorized actions.
- US-PLAT-006 — Global taxonomy and templates. As a Platform Admin, I want to govern skill taxonomy, reusable templates, vertical catalogs, and safe AI guardrails.
- US-PLAT-007 — Platform audit and observability. As a Platform Admin, I want health, incidents, immutable audit evidence, and high-risk action monitoring.
- US-PLAT-008 — Safe impersonation. As an authorized internal user, I want time-bounded, justified, visible, and audited impersonation that respects tenant and role scope.
- US-PLAT-009 — Localization packs. As a Platform Admin, I want to review, publish, roll back, and audit supported locale content without a code release.
- US-PLAT-010 — API credential governance. As a Platform Admin, I want scoped credential, origin, throttling, webhook-event, rotation, and revocation policy.
- US-BILL-001 — Invoice review. As a Billing Specialist, I want to review, assign, approve, reject, and annotate customer billing exceptions using Stripe-backed facts.
- US-BILL-002 — Pricing and catalog operations. As a Billing Specialist, I want to manage permitted Product, Price, capacity, discount, and billing-cycle configuration while Stripe remains authoritative.
- US-BILL-003 — Revenue and risk. As a Billing Specialist, I want revenue, churn, usage, payment-risk, and suspicious-activity views based on real billing data.
- US-BILL-004 — Billing communications. As a Billing Specialist, I want consent-appropriate payment reminders and statements with delivery history.
- US-BILL-005 — Reconciliation and exports. As a Billing Specialist, I want governed accounting reconciliation and exports with real job state and audit records.
- US-BILL-006 — Hosted customer actions. As a Billing Specialist, I want customers directed to safe Stripe-hosted payment method, invoice, subscription, cancellation, credit, and coupon workflows according to policy.
- US-SUP-001 — Global support search. As a Support Specialist, I want to find authorized users, Organizations, Programs, and Missions and understand their current context.
- US-SUP-002 — Case lifecycle. As a Support Specialist, I want to create, triage, assign, update, escalate, resolve, and audit support cases.
- US-SUP-003 — Guided troubleshooting. As a Support Specialist, I want issue-specific checklists, knowledge links, macros, and policy-aware Copilot guidance.
- US-SUP-004 — Customer escalation bridge. As Organization or Program staff, I want to escalate a masked Volunteer issue to AidOrbit without unnecessarily exposing personal information.
- US-SUP-005 — Incident communications. As a Support Specialist, I want to target incident notices and in-app guidance to affected, authorized audiences.
- US-SUP-006 — Privacy-aware diagnostics. As a Support Specialist, I want authorized session replay and diagnostic access with consent, expiration, redaction, and audit controls.
- US-SUP-007 — Safety escalation. As a Support Specialist, I want to monitor and route authorized SOS, safety, waiver-coverage, and service-health incidents.
- US-SUP-008 — Feedback and service quality. As Support leadership, I want support outcomes, satisfaction, recurring issues, and enablement gaps based on real case data.
P1: Reporting, API, Mobile, Accessibility, And AI
- US-XCUT-001 — Report reconciliation. As an authorized reporting user, I want dashboards, standard reports, custom reports, and exports to use the same scoped facts and workflow-state definitions.
- US-XCUT-002 — Scheduled reports. As an authorized reporting user, I want to schedule, pause, resume, deliver, inspect, and audit reports without leaking unauthorized rows or fields.
- US-XCUT-003 — Sensitive export boundaries. As an authorized user, I want operational exports to include only permitted fields and require stronger controls for medical, emergency, background, minor, or custom sensitive data.
- US-XCUT-004 — Stable public API. As an integration owner, I want versioned authentication, rate limits, idempotency guidance, error contracts, changelogs, and sandbox-safe examples.
- US-XCUT-005 — Webhook event catalog. As an integration owner, I want a discoverable event catalog, endpoint validation, signing, retry, replay, delivery history, and secret rotation.
- US-XCUT-006 — Native mobile breadth. As a Volunteer, I want an authenticated iOS/Android experience for discovery, schedule, registration follow-up, messaging, check-in, camera workflows, push, and consented location use.
- US-XCUT-007 — Offline operations. As a Volunteer or Mission-day operator, I want attendance and permitted field actions queued, visible, idempotent, and reconciled after connectivity returns.
- US-XCUT-008 — Push notifications. As a user, I want device registration and preference-aware push delivery for time-sensitive Mission, message, attendance, requirement, and safety events.
- Implemented slice: authenticated device registration/revocation, encrypted-token outbox records, per-category push preferences, and notification-preferences UI toggles. Device ownership is self-scoped and active devices are filtered by organization when delivery work is queued.
- Journey contract:
docs/product/journey-contracts/competitive-gap-017-push-notifications.md - Verification:
npm test -- app/src/api/__tests__/notifications.test.ts— passed (2 tests).npm run build:verify— passed. PHP syntax checks passed for the push migration, service, and controller. Focused PHPUnit could not run in this checkout because Composer andvendor/bin/phpunitare unavailable. - Remaining release gate: configure and verify a production FCM, APNs, or Web Push sender/worker with non-production provider credentials and a real authenticated device. Keep this story unchecked until queued deliveries are sent, provider failures revoke invalid tokens, and delivery status is reconciled.
- US-XCUT-009 — Accessibility evidence. As a user and procurement reviewer, I want keyboard, screen-reader, contrast, reduced-motion, mobile-viewport, and certification evidence for critical journeys.
- Implemented and verification-recorded: 2026-08-11. GAP-018 evidence now includes keyboard activation for notification guardrails, screen-reader semantic assertions, automated axe WCAG A/AA discovery scans (including contrast rules), reduced-motion preference coverage, and a 390px public Mission-discovery no-horizontal-overflow smoke. The checkbox remains open because these automated checks are not certification evidence for every critical journey.
- Journey contract:
docs/product/journey-contracts/competitive-gap-018-accessibility-certification-evidence.md - Owning repositories:
aidorbit-webowns the authenticated settings controls, representative Mission Control/public-hub evidence, and evidence record.goodnearby-webandaidorbit-wordpressare unchanged because this slice does not alter their Volunteer portal or marketing journeys. - Verification:
npm test -- app/src/components/settings/__tests__/NotificationAccessibilityCard.test.tsx app/src/hooks/__tests__/useMotionPreferences.test.tsx— passed (7 tests).npm run build:app-sync— passed.npx playwright test e2e/accessibility-routes.spec.ts --workers=1— passed (3 tests). Browser routes use intercepted API payloads and a local static server; this is UI regression evidence, not live authenticated or certification proof. - Remaining external/manual gates: Run keyboard-only critical-journey smoke tests for registration, requirements, Mission signup, check-in, reporting, settings, and admin tables; run NVDA/Chrome on Windows and VoiceOver/Safari on iOS or macOS; capture phone-viewport evidence for registration, signup, check-in, and staff rosters; establish a CI accessibility gate; and publish a VPAT or WCAG 2.2 AA conformance statement only after the broader automated and manual evidence is complete. Do not check this story until that evidence is captured.
- US-XCUT-010 — Localization. As an English- or Spanish-speaking user, I want localized navigation, workflow copy, messages, dates, times, numbers, reports, and exports.
- US-XCUT-011 — AI Copilot foundation. As an entitled user, I want permission-aware, scoped, grounded answers and next actions without fictional records or unauthorized disclosure.
- US-XCUT-012 — AI preview and approval. As an entitled user, I want AI-proposed mutations, messages, schedules, imports, and exports previewed before explicit approval.
- US-XCUT-013 — AI prompt library and personalization. As an entitled user, I want outcome-based prompts and suggestions limited to my personas, Programs, permissions, preferences, and current workflow state.
- US-XCUT-014 — Production-real workspaces. As any user, I want operational screens to show real authorized state or honest empty/error states, never fictional fallback customer data.
P2: Guardians, Groups, Education, Emergency Response, Donors, And Compliance
Guardians And Parents
- US-GUA-001 — Guardian invitation and identity. As a guardian, I want a secure invitation and identity-verification path tied to the correct dependent.
- US-GUA-002 — Consent and co-signing. As a guardian, I want to review and co-sign required waivers and safety policies with an auditable record.
- US-GUA-003 — Household readiness. As a guardian, I want to manage permitted dependent availability, transportation notes, emergency contacts, and readiness tasks.
- US-GUA-004 — Dependent alerts. As a guardian, I want preference-aware schedule, cancellation, SOS, incident, and missing-checkout alerts affecting my dependent.
- US-GUA-005 — Hours and guest review. As a guardian, I want to review permitted dependent or plus-one participation and service hours.
Corporate, School, And Community Group Leads
- US-GRP-001 — Cohort onboarding. As a Group Lead, I want to create a cohort, upload and validate a roster, invite members, and monitor onboarding readiness.
- US-GRP-002 — Group reservations. As a Group Lead, I want to reserve permitted Mission capacity while each participant retains identity, eligibility, attendance, and hours.
- US-GRP-003 — Group logistics. As a Group Lead, I want to coordinate transportation, arrival instructions, accessibility needs, and announcements.
- US-GRP-004 — Commitment tracking. As a Group Lead, I want to compare reservations, attendance, approved hours, plus-one participation, and organizational commitments.
- US-GRP-005 — Branded group impact. As a Group Lead, I want privacy-safe branded summaries and verifiable service artifacts for leadership.
Academic Service Learning
- US-EDU-001 — Course and LMS roster sync. As an Academic Coordinator, I want to import or synchronize course rosters and reconcile identity safely.
- US-EDU-002 — Placement and compliance. As an Academic Coordinator, I want to assign approved placements and monitor waivers, background checks, training, and deadlines.
- US-EDU-003 — Academic hours. As an Academic Coordinator, I want approved service hours mapped to course outcomes and exported in registrar-compatible formats.
- US-EDU-004 — Reflection and grading. As an Academic Coordinator, I want to collect reflections, apply rubrics, and record outcomes without exposing unrelated Volunteer information.
- US-EDU-005 — Campus discovery. As an Academic Coordinator, I want a campus-branded public page containing only approved Programs and Missions.
Emergency Response And Municipal Command
- US-EMR-001 — Incident activation. As an authorized commander, I want to activate an incident mode and operational period for a selected disaster-response Program.
- US-EMR-002 — Spontaneous Volunteer intake. As authorized response staff, I want to identify, credential, classify, approve, assign, or reject spontaneous Volunteers safely.
- US-EMR-003 — Deployment assignments. As response leadership, I want to assign qualified Volunteers and resources to incident Missions while preserving availability and chain-of-command scope.
- US-EMR-004 — Live situational map. As response leadership, I want scoped live check-ins, location consent, staffing gaps, hazards, SOS indicators, and authorized boundary overrides.
- US-EMR-005 — Geo-targeted broadcasts. As response leadership, I want priority communications limited by qualification, availability, location consent, Program, Mission, and operational role.
- US-EMR-006 — ICS and logistics. As authorized staff, I want Mission logistics, activity logs, and supported ICS forms tied to the correct incident and operational period.
- US-EMR-007 — After-action reporting. As response leadership, I want a scoped after-action package for Missions, assignments, attendance, approved hours, incidents, and improvement actions.
Donors And Funders
- US-DON-001 — Impact portfolio. As a donor or funder, I want privacy-safe Program impact, outcomes, trends, and stories tailored to my authorized portfolio.
- US-DON-002 — Pledge and allocation. As a donor or funder, I want to pledge or allocate funds transparently through real payment and accounting workflows.
- US-DON-003 — Compliance documents. As an authorized funder, I want current audited statements, policies, and evidence without access to unrelated internal documents.
- US-DON-004 — Recurring giving. As a donor, I want Stripe-backed recurring donation management and preference-aware impact updates.
- US-DON-005 — Funding brief. As an authorized funder or staff member, I want a reviewable funding brief grounded in real scoped outcomes and approved narratives.
Auditors And Compliance Officers
- US-AUD-001 — Audit trail review. As an auditor, I want immutable, scoped evidence for approvals, access, exports, financial actions, publications, and corrections.
- US-AUD-002 — Compliance checklists. As a compliance officer, I want assigned control checklists, evidence, remediation owners, deadlines, and immutable status history.
- US-AUD-003 — Evidence packages. As an auditor, I want governed evidence exports with templates, prerequisites, redaction, retention, delivery state, and audit history.
- US-AUD-004 — Policy drift alerts. As a compliance officer, I want actionable alerts when privacy, retention, accessibility, authorization, or other governed controls drift.
P2: External Integrators, Applicants, And Internal Development
External Partners And Integrators
- US-INT-001 — Partner credentials. As an integration owner, I want to issue, scope, rotate, revoke, and audit credentials and allowed origins.
- US-INT-002 — Webhook management. As an integration owner, I want to configure supported events, verify signatures, inspect attempts, retry failures, and rotate secrets.
- US-INT-003 — Sandbox and documentation. As an integration developer, I want safe test data, an API explorer, examples, errors, rate limits, and version guidance.
- US-INT-004 — Usage and alerts. As an integration owner, I want request volume, errors, rate limits, delivery health, and anomaly alerts.
- US-INT-005 — Embeddable widgets. As a partner webmaster, I want accessible, responsive, branded public widgets limited by publication rules, scoped keys, and allowed origins.
- Implementation recorded: 2026-08-14. The read-only Mission-feed iframe now fails closed unless its bound key has
widgets.read, a matching widget type, a configured HTTPS allowed origin, and the relevant organization/Program scope. Public feed SQL requires both a published public portal and public/published Mission publication settings; private, invite-only, unpublished, and missing-publication-data records are excluded before serialization. - Journey contract:
docs/product/journey-contracts/us-int-005-embeddable-widgets.md. - Owning repository:
aidorbit-web;goodnearby-webandaidorbit-wordpressare unchanged because this is an AidOrbit-hosted public iframe and API contract. - Verification:
php public/vendor/bin/phpunit tests/Http/Controllers/WidgetsControllerTest.phppassed (3 tests, 8 assertions). PHP syntax checks andnpm run build:verifyare required before release. - Remaining external/manual gate: On deployed staging, create a Program-scoped widget key for a real HTTPS partner test origin, embed the generated iframe at desktop and phone widths, and verify public published Missions render while private, invite-only, unpublished, wrong-origin, revoked-key, and out-of-scope Program requests fail closed. Keep this story unchecked until captured.
- Implementation recorded: 2026-08-14. The read-only Mission-feed iframe now fails closed unless its bound key has
Applicants And Beneficiaries
- US-APP-001 — Application drafts. As an applicant, I want an accessible multi-step application with validation, attachments, and secure saved drafts.
- US-APP-002 — Application state. As an applicant, I want submitted, under-review, changes-requested, approved, rejected, withdrawn, and next-action states explained.
- US-APP-003 — Required documents. As an applicant, I want to submit and replace permitted documents and understand verification state without seeing staff-only notes.
- US-APP-004 — Secure messaging. As an applicant, I want scoped messages, attachments, delivery/read state, and a permanent application history.
Internal Developers And QA
- US-DEV-001 — Component guidance. As a developer, I want current design-system documentation, examples, accessibility expectations, and change history.
- US-DEV-002 — Feature-flag validation. As QA, I want safe lower-environment feature overrides with precedence, ownership, rollout notes, and reproducible links.
- US-DEV-003 — Analytics verification. As QA, I want to inspect product events, runtime errors, provider health, and web-vital signals without using fictional success state.
- US-DEV-004 — Journey regression map. As QA, I want every completed user story mapped to unit, integration, RBAC/API, E2E, mobile, accessibility, and PostgreSQL checks.
- US-DEV-005 — Release evidence. As a release owner, I want build, migration, security, dependency, documentation, live-provider, and manual acceptance gates recorded honestly.
Discovery Backlog: Validate Before Commitment
These are credible volunteer-platform needs, but they must not be treated as committed implementation until product scope, personas, permissions, state models, and billing implications are approved.
- US-DISC-001 — Interview and reference workflow. Validate configurable Volunteer interviews, references, screening decisions, and due-date automation. Discovery contract:
docs/product/journey-contracts/us-disc-001-interview-and-reference-workflow.md. - US-DISC-002 — Shift swap and substitute requests. Validate Volunteer-requested swaps, call-outs, replacement eligibility, manager approval, and notification reconciliation.
- US-DISC-003 — Flexible service commitments. Validate recurring commitments and Volunteer-proposed service times outside fixed Mission shifts. Discovery contract:
docs/product/journey-contracts/us-disc-003-flexible-service-commitments.md. - US-DISC-004 — Expenses and mileage. Validate Volunteer expense, mileage, receipt, approval, reimbursement, export, and retention requirements. Discovery contract:
docs/product/journey-contracts/us-disc-004-expenses-and-mileage.md. - US-DISC-005 — Person deduplication and merge. Validate duplicate detection, safe merge, undo/evidence, inactive status, exit reasons, and reactivation.
- US-DISC-006 — Equipment and resource custody. Validate issuance, assignment, condition, return, loss, and audit workflows for badges, equipment, or supplies. Discovery contract:
docs/product/journey-contracts/us-disc-006-equipment-and-resource-custody.md. - US-DISC-007 — Confidential complaint workflow. Validate Volunteer complaints, safeguarding concerns, whistleblower protection, restricted case access, and escalation policy. Discovery contract:
docs/product/journey-contracts/us-disc-007-confidential-complaint-workflow.md. - US-DISC-008 — Volunteer-to-supporter CRM lifecycle. Validate consent-aware synchronization of Volunteer engagement with donor or supporter CRM records. Discovery contract:
docs/product/journey-contracts/us-disc-008-volunteer-to-supporter-crm-lifecycle.md. - US-DISC-009 — Volunteer fundraising. Validate Volunteer-led campaigns, peer fundraising, attribution, payment processing, and donor privacy boundaries. Discovery contract:
docs/product/journey-contracts/us-disc-009-volunteer-fundraising.md.
Required Development Order
Within each priority, resolve data-scope and state-integrity dependencies before convenience or automation:
- Public visibility, identity, assigned Program scope, and direct API denial.
- Mission lifecycle, registration, capacity, waitlists, and requirements.
- Day-of attendance, checkout exceptions, hours, and correction audit.
- Communications, cancellation suppression, reports, exports, and reconciliation.
- Organization governance, privacy, billing, integrations, and public-site administration.
- Mobile/offline, accessibility, localization, and AI-assisted workflows.
- Specialized personas and approved discovery items.
Source Guidance
AGENTS.mdCLAUDE.mddocs/product/README.mddocs/product/01-personas-and-jobs.mddocs/product/02-core-journeys.mddocs/product/03-workflow-states.mddocs/product/04-permissions-and-scope.mddocs/product/05-domain-language.mddocs/product/06-edge-cases-and-invariants.mddocs/product/07-e2e-test-map.mddocs/product/09-pr-journey-checklist.mddocs/product/10-journey-regression-map.mddocs/architecture/aidorbit-vertical-profiles-operating-contract.mddocs/audits/competitive-analysis-current-state/GAP_SUMMARY_FOR_CHATGPT.mddocs/front-end-plan.mdas historical input only