# Features — Click Foundation - LTI Integration Tool

Evidence date: 2026-10-19. Revision: `master` `fbf20a6` (2022-05-30, "Initial commit"). Only remote branch.

The source calls itself the TAO LTI 1.3 DevKit. Status below is from `README.md`, `CHANGELOG.md`, `doc/`, and the code on `master`.

Planned features written as a roadmap: **none found**.

In-development work: **none found**. Git history is a single import commit.

## Current features (master)

| Feature | What it does | Evidence | Status |
|---|---|---|---|
| Dashboard | Shows LTI configuration, configured users, and Redis counts for memberships, outcomes, line items, scores, results, assessments, and ACS controls | `src/Action/DashboardAction.php`, `PlatformStatisticsCollector` | Implemented |
| Platform: resource link launch | Form builds an `LtiResourceLinkRequest` OIDC URL | `LtiResourceLinkLaunchAction`, `LtiResourceLinkLaunchType` | Implemented |
| Platform: deep linking launch | Form builds an `LtiDeepLinkingRequest` | `DeepLinkingLaunchAction`, `DeepLinkingLaunchType` | Implemented |
| Platform: deep linking return | Receives the tool's content selection | `DeepLinkingReturnAction`, route `/platform/message/return/deep-linking` | Implemented |
| Platform: start proctoring | Form builds `LtiStartProctoring` | `ProctoringLaunchAction`, `ProctoringLaunchType` | Implemented |
| Platform: proctoring return and end | Return route with optional identifier; end is POST | `ProctoringReturnAction`, `ProctoringEndAction` | Implemented |
| Platform: submission review launch | Form builds `LtiSubmissionReviewRequest` with AGS claim | `SubmissionReviewLaunchAction`, `SubmissionReviewLaunchType` | Implemented |
| Tool launch | Single endpoint receives platform messages | `MessageLaunchAction`, route `/tool/launch` | Implemented |
| Tool deep-linking response | Operator posts selected content | `DeepLinkingResponseAction` | Implemented |
| Tool proctoring response | Operator posts the proctoring response | `ProctoringResponseAction` | Implemented |
| Deep-linking catalogue | Five sample resources (LTI link, image, link, file, HTML) | `config/devkit/deep_linking.yaml` | Implemented |
| Claims editor configuration | Configurable claim list for editors | `config/devkit/claims.yaml` | Implemented. Field-by-field contents not reproduced here |
| Shareable generator URLs | Launch and service-client forms can be shared by URL | Changelog 1.3.0; `FormShareUrlGenerator` | Implemented |
| NRPS UI CRUD | Create, view, edit, delete custom memberships | `src/Action/Platform/Nrps/*` | Implemented |
| Default NRPS membership | Always-on membership `default` from `users.yaml` | `DefaultMembershipFactory` | Implemented |
| NRPS service | `GET /platform/service/nrps/{context}/memberships/{id}` with role and paging | `MembershipServiceServerBuilder` | Implemented |
| NRPS HTTP API CRUD | List, get, create, patch, delete | `src/Action/Api/Platform/Nrps/*`, OpenAPI | Implemented |
| AGS UI CRUD | Line items with scores and results kept in cache | `src/Action/Platform/Ags/*`, `src/Ags/*` | Implemented |
| AGS services | List, get, create, update, delete line items; post scores; list results | `config/routes.yaml` `platform_service_ags_*`, handlers in `config/services.yaml` | Implemented |
| AGS tool client | AJAX client to list, create, update, delete line items, publish a score, list results | `src/Action/Tool/Ajax/Ags/*` | Implemented |
| Basic Outcome service and list | POST service, HTML list, GET delete | `BasicOutcomeProcessor`, `ListBasicOutcomesAction`, `DeleteBasicOutcomeAction` | Implemented. No create form; outcomes appear when the service writes them |
| Basic Outcome tool client | AJAX caller | `BasicOutcomeServiceClientAction` | Implemented |
| ACS assessment UI CRUD | Identifier plus status | `src/Action/Platform/Proctoring/*`, `AssessmentType` | Implemented |
| ACS service | POST control to an assessment | `app.service.proctoring_acs_controller` | Implemented |
| ACS HTTP API CRUD | List, get, create, patch, delete | `src/Action/Api/Platform/Proctoring/*` | Implemented |
| ACS tool client | AJAX caller | `AcsServiceClientAction` | Implemented |
| Generic LTI service client | Operator enters URL, method, scopes, media type and calls a service | `LtiServiceClientAction`, `LtiServiceClientType` | Implemented |
| Service client autocomplete | AJAX suggestions for scope and media type | `LtiServiceClientAutocompleteAction` | Implemented |
| Launch message API | POST one of four message types, optional `verbose` | `CreateMessageLaunchAction`, `doc/api.md` | Implemented |
| Launch message CLI | `devkit:create:message:launch` with `--type` and `--parameters` | `CreateMessageLaunchCommand`, `doc/cli.md` | Implemented |
| API key firewall | Bearer token compared with `APP_API_KEY` | `ApiKeyListener`, `ApiKeyProvider` | Implemented for a presented key. Missing-header case is open; see business rules |
| OIDC, token, and JWKS | Provided by the LTI bundle routes | `config/routes/lti1p3.yaml` | Implemented via the bundle. Exact paths live in the bundle routing files |
| Health check | `/ping` and `/health-check` | `config/routes/health_check.yaml` | Implemented |
| PHP info page | `GET /php-info` | `PhpInfoAction` | Implemented. Public, same as the rest of the UI |
| Version badge | Homepage version from parameter `application_version` `2.4.2` | `config/services.yaml`, changelog 1.4.0 | Implemented. Changelog top section is 2.4.3 |
| Docker Compose stack | Traefik, nginx, PHP-FPM, Redis, Redis Commander | `docker-compose.yml`, `doc/installation.md` | Documented and implemented as compose |
| Kubernetes PHP image | Multi-stage `php:8-fpm-alpine` Dockerfile | `docker/kube/Dockerfile`, changelog 1.0.0 "k8s compliance" | Image definition only. No manifests in the repo |
| OpenAPI document | HTTP API contract, server `http://devkit-lti1p3.localhost` | `doc/openapi/devkit.yaml` | Documented |
| User statistics chart | Dashboard charts for users and platform resources | Changelog 2.2.0, dashboard templates | Implemented in templates. Chart library details not fully traced |
| Anonymous and custom launch users | Launch as anonymous, a listed user, or a typed custom user | Launch form types, `UserAuthenticator` | Implemented |
| Click platform label | Platform name "Click Learner Portal Platform" and loopback audiences on ports 8000 and 8001 | `config/packages/lti1p3.yaml` | Implemented configuration. Not a separate product feature |

## Completed, as recorded by the changelog

`CHANGELOG.md` is the upstream DevKit history frozen inside the import. It is evidence of what the snapshot claims to contain, not of Overdrive release dates. Highlights that match code still present:

| Version | Claim in the changelog | Still visible |
|---|---|---|
| 1.0.0 | Platform and tool messages for resource link and deep linking; NRPS and basic outcome; generic service client; Docker | Yes |
| 1.4.0 | PHP 8 support kept alongside `>=7.2`; version indicator | Yes. Dockerfiles are PHP 8 |
| 1.6.0 | Custom user on resource-link and deep-linking launch | Yes, on the launch forms |
| 1.7.0 | Default NRPS membership from the users file; custom memberships in cache | Yes |
| 1.9.0 | Proctoring messages and ACS CRUD; health-check bundle added in 1.9.1 | Yes |
| 2.0.0 | AGS line item, result, and score CRUD; command renamed to `devkit:create:message:launch`; Traefik | Yes |
| 2.2.0 | Dashboard statistics; NRPS and ACS HTTP APIs; OpenAPI | Yes |
| 2.3.0 | Submission review and end-assessment flows | Yes |
| 2.4.0 | API and CLI can generate deep linking, start proctoring, and submission review | Yes |
| 2.4.3 | Lockfile update of `lti1p3-core` to 6.7.1 | Yes in `composer.lock`. Displayed version parameter remains 2.4.2 |

## Changed relative to the DevKit docs in the same tree

These are conflicts inside the snapshot, not a second branch:

| Item | Docs say | Code says |
|---|---|---|
| Example registration id | `devkit` in `doc/cli.md` | `local` in `lti1p3.yaml` |
| Public URL | `http://devkit-lti1p3.localhost` | Registration audiences `http://127.0.0.1:8000` and `:8001` |
| Product name | TAO LTI 1.3 DevKit | Platform name Click Learner Portal Platform |
| App version | Changelog 2.4.3 | Parameter and OpenAPI 2.4.2 |
| Tool JWKS | Key set name `toolSet` | URL path `deliver.json` plus a trailing quote character |

## Planned

None documented.

## Deprecated or removed

The changelog says `create:message:launch` was renamed to `devkit:create:message:launch` in 2.0.0. The old command name is not registered in `CreateMessageLaunchCommand`. Provenance: **Documented** and **Implemented**.

No other removed Click Foundation feature could be identified, because there is no earlier Overdrive history.

## Not features of this repository

- Click learner accounts, courses, grades stored outside this cache, or a portal UI.
- Sonar configuration files named in the onboarding inventory. They are not on `master`.
