These are the expected production and test changes. A final file count depends on the licensing decision described later.
01
Launch/Enums/LtiContextRole.php
New allowlist for the standard roles claim and exact Instructor, Learner, and Teaching Assistant context-role URIs.
New
02
Launch/Actions/ResolveLtiProvisioningRole.php
New action that maps only the exact Instructor URI to Role::INSTRUCTOR; missing, malformed, or unrecognized roles fall back to Student.
New
03
Launch/Actions/FindSchoolByLmsId.php
Accept the validated deployment and query only its mapped schools. Do not resolve an LMS school ID through another deployment.
Security
04
Launch/Actions/NormalizeLtiUserIdentifier.php
New compatibility helper used by resource launch, Deep Linking, and account connection so Schoology-style sub values are handled consistently.
New
05
Launch/Actions/FindOrCreateUserForLtiContext.php
Resolve the launch role once; provision new instructors; promote an existing Student on a valid Instructor launch; never demote existing Instructor or administrator roles.
Core
06
Launch/Actions/DoLtiDeepLinkLaunch.php
Require a signed Instructor role for automatic provisioning and reuse the central provisioning action when the instructor's first interaction is Deep Linking.
Core
07
Api/v1/.../LtiConnectController.php
Use the same identifier normalization helper as both launch paths when linking an existing account.
Modify
08
Launch/Actions/DoLtiResourceLinkLaunch.php
Make the inactive-user/payment redirect role-aware so a newly recognized instructor is not treated as an inactive known-LMS student.
Policy
09
Mapping request + database migration
Reject duplicate lms_school_id values within one deployment and add a unique deployment/mapping constraint after auditing existing data.
Hardening
10
LtiTestHelpers.php + LTI system tests
Add signed-role fixtures and regression coverage for role mapping, mapping scope, Deep Linking, identity normalization, and payment behavior.
Tests
11
Academic/Lti/Setup/Contracts/Lti13Service.php
Remove three dd($e) calls at lines 154, 175, 190. Replace with proper error handling and logging. These debug statements halt execution and expose sensitive data.
Gap found
12
UpdateLtiRegistrationDeploymentMappingRequest.php
Add uniqueness validation for lms_school_id within a deployment. Current rules only check ['nullable', 'string']—no duplicate prevention.
Gap found