New: ROOTNODE_ACADEMY_BUSINESS_AND_PRODUCT_ARCHITECTURE.md (canonical business/platform bridge — course families, delivery modes, BUILT NOW/PHASE 7 BUILT/FUTURE), OFFERING_AND_ REGISTRATION_MODEL.md (lifecycle diagrams, capacity mechanics), STUDENT_GUARDIAN_DATA_ MODEL.md (data minimization, RBAC, legal-review items), SCHOOL_AND_COMMUNITY_DELIVERY_ ARCHITECTURE.md (organization/location mapping, explicitly not multi-tenancy), PHASE7_PRODUCT_ARCHITECTURE.md (phase summary). Updated: WEBSITE_ENROLLMENT_INTEGRATION.md (documented future offering/registration flow, current live contract unchanged), platform/README.md (test list). Co-Authored-By: Claude Sonnet 5 <[email protected]>
3.7 KiB
School & Community Delivery Architecture
Phase 7 Step 27 — how a future school, library, homeschool organization, or community partner maps onto the platform's new organization/location/offering model. This is architecture documentation for an asset-light delivery strategy — RootNode favors partner/temporary venues over building permanent classrooms everywhere, at least initially.
The mapping
Organization (e.g. "Oxford Community Library")
└─ Location (e.g. "Library — Community Room B", or "Online")
└─ Offering (e.g. "After-School ROOT Foundations — Library Branch, Spring 2027")
├─ program_id → an existing program (ROOT_ V1, or a future family)
├─ curriculum_package_id → optionally, a subset (Step 20)
├─ delivery_mode → 'after_school' / 'community' / 'school' / 'homeschool'
├─ cohort_id → the real classroom/roster mechanism, unchanged
└─ instructor_offerings → who teaches it
A school, library, or homeschool organization is represented as ONE organizations row. It may
have multiple locations (a school with two campuses; a library system with several branches).
Each real delivery of curriculum at that organization is its own offerings row — this lets one
organization run several different offerings (different programs, different cohorts, different
semesters) without any of them being confused for each other, and without needing a new
mechanism for "an organization has many offerings" (it's the same one-to-many organization_id
foreign key locations and offerings already both carry).
What this is NOT
Not multi-tenancy. No table in this schema is partitioned by organization_id the way a
true multi-tenant SaaS product would be — students, instructors, courses, and progress are not
scoped to an organization. An organization is a business/delivery context an offering can
optionally reference, nothing more. RootNode Academy remains one Academy with one shared
platform, one curriculum, and one set of students — a student who attends via a school
partnership is a normal RootNode student, indistinguishable in the data model from a self-paced
student, except for which offering(s) they registered through.
Multi-location operation
Two offerings at two different locations coexist with no special isolation mechanism needed —
they're just two rows in offerings with different location_ids, each with its own cohort/
roster/registrations. platform/test/e2e-phase7.js proves this concretely: two offerings, two
locations, verified to never leak state into each other. This is operational separation (two
independent business records), not a security/tenant-isolation claim.
What was explicitly NOT built this phase
- No school SIS integration (no roster import/export, no grade-passback, no LMS interoperability standard like OneRoster or LTI).
- No Google Classroom integration.
- No organization-specific portal or branding — every organization's students see the same RootNode Academy platform; there is no white-labeling.
- No organization-level admin role — an organization contact does not get their own login or visibility into the platform; all administration remains through RootNode's own instructor/admin accounts, same as any other offering.
Future extension points (not built, but not blocked)
If a future phase needs an organization contact to see their own offering's roster/progress
(e.g. a school liaison checking on their students), that's a new, scoped RBAC role — the
organizations/offerings model here doesn't need to change to support it, only the
authorization layer would need a new role definition, deliberately deferred rather than guessed
at now.