⚠️ OpenSpec-managed issue — this content is automatically synced
from the openspec/ directory. Manual edits will be overwritten on next sync.
Artifacts
Summary
LessonProgressHandler and XapiCompletionHandler read lessons and enrolments, and write a LessonCompletion or run the enrolment's complete transition, inside the save of the xAPI statement that fired them. Hydra gate 61 (ADR-078: post-*ed work is async by default) flags both: an unbounded findAll() on the write path, and a write inside another object's write. As #1208 did for the competency roll-up, both handlers now only check the statement is a completed or passed xAPI statement in the learniq register and queue it through OpenRegister's ListenerDeferralService; XapiStatementFollowUpJob runs the work as the learner who sent the statement.
Specs
Tasks
Synced from openspec/changes/gate-61-deferral by OpenSpec workflow
App: learniq
Artifacts
Summary
LessonProgressHandlerandXapiCompletionHandlerread lessons and enrolments, and write a LessonCompletion or run the enrolment'scompletetransition, inside the save of the xAPI statement that fired them. Hydra gate 61 (ADR-078: post-*edwork is async by default) flags both: an unboundedfindAll()on the write path, and a write inside another object's write. As #1208 did for the competency roll-up, both handlers now only check the statement is a completed or passed xAPI statement in the learniq register and queue it through OpenRegister'sListenerDeferralService;XapiStatementFollowUpJobruns the work as the learner who sent the statement.Specs
Tasks
openspec validate gate-61-deferralpassescomposer check:strict,npm run lint, hydra gates (gate 61 PASS), each with its exit code in the PR bodySynced from
openspec/changes/gate-61-deferralby OpenSpec workflowApp:
learniq