Skip to main content

Scholiq — Applied Specifications

All 6 Wave-2 compliance-audit wedge specs have been applied. Specs live in openspec/changes/ and were driven by the Hydra OpenSpec workflow.


1. nextcloud-app

Path: openspec/changes/nextcloud-app/

Status: Applied

Summary: Foundation spec that ships the standards-compliant Nextcloud app shell before any other capability can land. Delivers: appinfo/info.xml with hard dependencies on OpenRegister and OpenConnector; lib/AppInfo/Application.php registering all services and listeners; the Vue 2 SPA entry point (src/main.js); the admin and user settings panels; src/manifest.json adopting CnAppRoot Tier 4 (ADR-024); l10n/nl.js and l10n/en.js i18n stubs. All downstream specs (course-management, enrolment, certification, compliance-audit, dashboard) depend on this foundation.


2. course-management

Path: openspec/changes/course-management/

Status: Applied

Summary: Adds the Course and Lesson schemas (the data layer all other wedge specs operate on), plus the XapiStatement schema for the built-in LRS substrate. Implements the cmi5 JWT launch protocol via Cmi5LaunchTokenService (legitimate PHP — cryptographic operation). Introduces CoursePublishGuard enforcing that at least one published Lesson must exist before a Course can publish. Content types supported: text, video, scorm12, scorm2004, cmi5, lti, quiz. Course lifecycle: draft → published → archived; Lesson lifecycle: draft → published → retired. Aggregations on Course expose enrolledLearners and completedLearners counts.


3. enrolment

Path: openspec/changes/enrolment/

Status: Applied

Summary: Adds the Enrolment schema linking learner identities to courses with mandatory-training and due-date tracking. Lifecycle: pending → active → completed | withdrawn | failed. Declarative calculations provide isOverdue, daysRemaining, and ragStatus (RAG traffic-light). Declarative notifications deliver T-30/T-7/T-1 due-date reminders (idempotency-keyed), welcome and completion confirmations, and overdue alerts to the learner's manager (HR-group fallback). Bulk enrolment is handled by posting to OR's batch endpoint from BulkEnrolModal — no BulkEnrolmentService PHP class. The myMandatoryTraining widget declaration on the Enrolment schema powers the Learner Home dashboard.


4. certification

Path: openspec/changes/certification/

Status: Applied

Summary: Adds the Credential schema for Open Badges 3.0 verifiable credentials, append-only per ADR-008. Credential issuance is guarded by CredentialSigningService (legitimate PHP — RS256 cryptographic operation) which builds the OB3 JSON-LD assertion and signs it with the tenant's RSA private key. The CredentialIssuanceHandler listener bridges the Enrolment completed event to the Credential issue transition. Lifecycle: issued → revoked | expired. Calculated fields provide daysUntilExpiry, expiryStatus, and boolean flags (isExpiringIn90Days, isExpiringIn30Days, isExpired) that drive tiered notifications. A public unauthenticated verification endpoint (CredentialVerifyController) is declared. RSA key management is handled by KeyManagementService + KeyAdminController.


5. compliance-audit

Path: openspec/changes/compliance-audit/

Status: Applied

Summary: The primary purchaser-facing deliverable of Wave 2. Adds the Regulation schema (coverage tracking framework) and the Attestation schema (append-only HMAC-signed evidence per ADR-008). Regulation aggregations perform live cross-schema joins over Enrolment/Attestation/Credential via regulationSlug to compute coveragePercent and ragStatus. The officerAlertOnCoverageDrop notification uses OR's calculatedChange trigger to alert compliance officers when coverage drops to red — no background job. AttestationSigningGuard validates cmi5 xAPI completion records and computes HMAC-SHA256 signatures at the draftedsigned transition. AuditPackExportController streams the ADR-008 §6 audit-pack ZIP (ndjson + csv + manifest + signature-verification instructions). Regulation widgets (coverageGrid, boardProof, attestationCount) are declared on the schema and referenced from the Compliance dashboard page.


6. dashboard

Path: openspec/changes/dashboard/

Status: Applied

Summary: Wires the manifest pages for role-appropriate dashboards: the Compliance dashboard (Regulations coverage grid + attestation count), the Learner Home (mandatory training task list), and the AdminHealth dashboard (observability stats via HealthController). The intended role-aware visibleIf page gating is designed but not yet supported by nc-vue manifest schema v1.4.0 — pages currently declare conformant-but-minimal {id, title, type:custom} widgets and the role routing is a follow-up tracked in nc-vue umbrella #200. All schema widget declarations (myMandatoryTraining, coverageGrid, boardProof, attestationCount) are present in the register and will be used once the manifest schema adds widget-ref support.