DEC-003 — Bounded Core V1 Capability Taxonomy¶
Status: FORMALIZED_FOR_T1_CORE
Approval basis: requesting-user instruction to execute the bounded Core V1
recommendation on 2026-08-10. This record does not certify optional business
workflows.
Decision¶
Scola authorization uses a canonical capability vocabulary with separate action and scope semantics. Assigned roles are eligibility; the session active role is the authority context. Entitlement and installation are required package gates, not substitutes for capability or record scope.
Canonical action vocabulary¶
The Core contract recognizes only these action classes unless a later decision extends the vocabulary:
view, list, create, update, delete, archive, manage, approve,
reject, publish, export, configure, execute, reset, activate, and
deactivate.
view/list never imply mutation, approval, export, credential change, or
cross-tenant access. manage is not a wildcard for unrelated domains; it must
be bound to a named resource and scope.
Canonical scope vocabulary¶
Every protected action must resolve against one or more of:
tenant, company, school_unit, class_or_batch, assignment, self,
linked_child, linked_parent, record_owner, and cross_company.
cross_company is denied by default. A route that does not declare its scope is
not a certified Core route. Foreign IDs and mixed-company foreign keys must be
rejected atomically without existence leaks.
Core role/action/scope contract¶
| Role context | Allowed Core examples | Scope rule |
|---|---|---|
school_admin / head_admin |
Core student, parent, academic, timetable, manual-attendance and communication management | Own company/school; no implicit cross-company access |
admin_staff |
Approved operational Core reads and explicitly granted mutations | Own company and assigned operational scope |
teacher |
Schedule/read, assigned student roster and attendance actions explicitly granted | Assignment/class/batch scope; no arbitrary student or company scope |
homeroom |
Teacher capabilities plus homeroom-specific class/child views | Assigned homeroom/class and linked child scope |
student |
Own profile, own attendance/academic/communication reads | self only, except explicitly projected public/core data |
parent |
Linked-child portal and attendance/academic reads | linked_child only; no peer-child lookup |
principal / approved leadership read role |
Approved Core aggregate/read surfaces | Own company/school; no mutation unless separately declared |
platform_operator |
Platform control-plane operations | Platform tenant scope; not school-user data by default |
This table is the bounded Core baseline. Optional roles and domains such as HR, payroll, finance, admissions, Dapodik, BOS, and smart attendance require their own package decision and must remain denied/gated until then.
Enforcement contract¶
- FE menu and router metadata may improve UX only; backend registry, capability resolver, ACL/record rules, and tenant scope are authoritative.
- API registry entries must declare domain, capability, method/action precedence, and optional feature flag. Unknown protected routes fail closed.
- Direct dataset/RPC calls cannot bypass the same action, capability, package, and record-scope contract.
- Capability resolution uses the session active role; inactive assigned roles, global role fields, and group unions cannot widen authority.
- Installation without entitlement, or entitlement without capability, does not expose a menu, route, API, model, attachment, or mutation.
- Elevated service paths must name the allowed model/action and re-check company
and record ownership before any
sudo/superuser operation.
Machine-readable acceptance¶
The authoritative matrix and acceptance cases are in
T0-E2-DEC-003-capability-taxonomy.json. T1 may begin only after the current-tip
E1.2 evidence rebind passes and these Core acceptance cases remain green:
- inactive-role conflict cannot widen a capability;
- role switch changes only that session;
- protected route and method/action variants resolve explicitly;
- unknown protected route is denied;
- Core read/list/detail/mutation/attachment/mail paths reject foreign-company records;
- optional installed-but-unentitled API and direct model RPC are denied;
- parent/self/assignment scopes reject unrelated IDs;
- FE capability metadata and BE registry agree for every T1 route.
Optional-domain capability matrices remain downstream and are not silently included in this decision.