# Features — Click Foundation - LTI Integration Platform

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

There is no README or changelog. Status below is from the code and config on `master`.

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

In-development work: **none found**. Git history is two commits on 2022-05-30, and the second commit is the whole application. Nothing is marked as a branch, TODO ticket, or unfinished milestone. Comments inside `DefaultController` do say the authenticator call is "TESTING ONLY".

Recently changed features: **none after the initial import**. `master` has not moved since `6731ace`.

Deprecated or removed features: **none found** in Git history. The parent commit `16e328c` contains only `.gitignore`.

## Current features (master)

| Feature | What it does | Evidence | Status |
|---|---|---|---|
| Resource-link launch | `/default` builds an LTI 1.3 resource-link request for registration `local` and returns an HTML auto-post form. The route does not restrict the HTTP method. | `src/Controller/DefaultController.php`, route `default_list` | Implemented |
| In-process OIDC | The same action runs `OidcInitiator` and `OidcAuthenticator` on synthetic PSR-7 requests and does not redirect the browser through those steps | `DefaultController::list`, `createServerRequest` | Implemented |
| Anonymous launch identity | Authenticator is constructed as success + anonymous. The returned result has a null user identity. | `UserAuthenticator`, call site `new UserAuthenticator(true, true)` | Implemented. Comment says testing only |
| Fixed login hint and resource id | Login hint is `loginHint`. Resource-link id is `resourceLinkIdentifier`. Title is `LTI Resource Link`. URL is `http://127.0.0.1:8001/tool/launch`. | `DefaultController::list` | Implemented |
| Registration `local` | Client id `common_client_id_value`, deployment `deploymentId1`, platform Click Learner Portal Platform, tool "LTI 1.3 DevKit (as tool)" | `config/packages/lti1p3.yaml` | Implemented |
| Platform JWKS | `GET /lti1p3/.well-known/jwks/{keySetName}.json` | Bundle route file imported by `config/routes/lti1p3.yaml` | Implemented as a route import |
| Platform OIDC authentication | `GET` and `POST /lti1p3/oidc/authentication` | Same | Implemented as a route import |
| Tool OIDC initiation | `GET` and `POST /lti1p3/oidc/initiation` | Same | Implemented as a route import. The configured tool audience is port 8001, not this app's platform audience |
| Platform OAuth2 token | `POST /lti1p3/auth/{keyChainIdentifier}/token` | Same | Implemented as a route import |
| Dev signing keys | `platformKey` and `toolKey` both use `config/secrets/dev/public.key` and `private.key` | `lti1p3.yaml` | Implemented |
| Filesystem cache | Default Symfony filesystem cache. Redis adapter lines are comments. | `config/packages/cache.yaml` | Implemented as the default. Redis is not enabled |
| English locale | `default_locale: en`, fallback `en` | `config/packages/translation.yaml` | Implemented. No translation files |
| Console entry | `bin/console` boots the kernel. No application command class exists. | `bin/console`, `src/` | Implemented as the Symfony entry. No custom command |

## Present in the tree and not a running feature

| Item | Why it is not a current feature | Evidence |
|---|---|---|
| Second resource-link example | Placed after `return`. URL `http://tool.com/resource`, learner role, custom claim. Uses an undefined `$registrationRepository`. | `DefaultController.php` after the return |
| Commented Ignite launch | Comment only. Target `https://testrunner-ignite.prod.gcp-eu.taocloud.org/api/v1/auth/launch-lti-1p3/`. Platform name in that comment is "Click Learner Portal". | Commented block in `DefaultController` |
| `App\Controller\RegistrationRepository` | Implements the same interface the bundle already aliases. The action type-hints the interface, so the bundle repository is the one injected. This class is still registered as an `App\` service. | `RegistrationRepository.php`, `config/services.yaml`, bundle `services.yaml` alias |
| `new_public_key.pem` | Not referenced by config or PHP | `config/secrets/dev/new_public_key.pem` |
| `App\Tests\` autoload | `composer.json` maps `App\Tests\` to `tests/`. That directory is not in the commit. | `composer.json` |
| Sonar scanner files | Named in the onboarding inventory. Not in `master`. | Git tree at `6731ace` |

## Not in this repository

These exist in the related DevKit repository (`Click Foundation - LTI Integration Tool`) and are absent here:

- Dashboard, launch forms, and operator CRUD
- Deep linking, proctoring, submission review
- AGS, NRPS, ACS, Basic Outcome
- HTTP API under `/api` and a `devkit:create:message:launch` command
- Docker Compose and a kube image
- Redis-backed demo records and `config/devkit/users.yaml`

`click-learner-portal-platform` has a `GET /default/{learnerId}/{quizId}/{quizEndDate}` launch and a registration `tao`. This repository's only launch route takes no path parameters and has no `tao` registration.

## Planned

No planned feature is written down in the repository.
