fix: restore the app identity development lost in a merge (learniq cannot boot without it) - #463
Merged
Merged
Conversation
Renames every remaining SCHOLIQ_-prefixed constant (SCHOLIQ_REGISTER, SCHOLIQ_NATIVE_COLLECTION_SCHEMA) to LEARNIQ_*, declaration and every self::/static:: use together in the same edit. Renames the private isScholiqXapiStatement() method to isLearniqXapiStatement() in XapiCompletionHandler and LessonProgressHandler, and every call site. Also fixes stale "Scholiq" prose in docblocks, comments, and log/error messages across lib/ (class headers, register/event-filter descriptions, stale scholiq_register.json file references, and two factually-wrong autoloader-ordering comments that still described the OLD app id's alphabetical position relative to openregister). Deliberately NOT renamed: the wire/format identifiers kept for backward compatibility (scholiq-json, scholiq-native, scholiq-learning-record, scholiqField, scholiqNative, _scholiqRecordId, FORMAT_SCHOLIQ_JSON, the course-<id>_scholiq.json export filename), the AVG processing-activity register codes (scholiq-ai-features and siblings), the three repair steps' OLD_APP_ID/OLD_SLUG/REGISTER_SLUG_PREFIX constants and their historical-fact prose, @SPEC tags pointing at real openspec/ paths that still exist under the old name, and two newly-identified persisted external identifiers with no migration path: the NC Files folder prefix 'Scholiq/{tenant}/...' (CoursePackageFileWriter, LearningRecordBundleWriter, LearningRecordImportIntakeService) and the NC group-name prefix 'scholiq-cohort-' generated by RolloverService::groupName().
Renames SCHOLIQ_SCHEMAS -> LEARNIQ_SCHEMAS (and its scholiqResults ->
learniqResults local variable) in LearniqNotificationSettings.vue, and
fixes stale "Scholiq" prose, CSS class/id names (scholiq-notif-settings__*,
scholiq-settings__*, scholiq-dashboards__*, scholiq-admin, scholiq-domain-
dashboard, scholiq-dataexchange-settings__*), stale lib/Settings/
scholiq_register.json file references, and user-facing settings copy
across the Vue views, manifest.json (Prometheus metric help text and
dashboard/manifest _note fields), main.js, icons.js and app.css.
Verified before renaming: every touched CSS class/id is component-scoped
with no cross-file selector or test dependency (checked via grep across
src/ and tests/ before each rename).
Also corrects two DashboardAdmin.vue/DashboardTeacher.vue/main.js
comments that claimed dashboard visibility was gated on a literal
`scholiq-{role}` NC group — that group naming was already dead (per
RoleSelector.php's own comment, it "never existed on any instance");
the real mechanism is DashboardRoleService resolving dashboardRoles
from NC's admin group and the unprefixed role-backing groups. The old
comment was inaccurate under the old name too, not just stale naming.
Renames the global function scholiq_nc_base_is_safe_to_load() (and the $scholiqNcRoot variable) to learniq_nc_base_is_safe_to_load()/ $learniqNcRoot across tests/bootstrap-nc-guard.php, bootstrap.php and bootstrap-unit.php together, plus SCHOLIQ_E2E_SEEDED -> LEARNIQ_E2E_SEEDED and SCHOLIQ_DOCS_CAPTURE -> LEARNIQ_DOCS_CAPTURE (both env var names, kept in sync with the root playwright.config.ts in the next commit). Fixes two e2e assertions that were checking live reality against the wrong string and would fail against the deployed app: detail-pages.spec.ts and index-pages.spec.ts asserted `page.title()` contains 'Scholiq' — the live page title is 'Learniq - Nextcloud'. Also fixes a silently-broken soft-check in nextcloud-app.spec.ts: a combobox-option filter searched `/scholiq/i` while its own comment said to look for 'learniq', so the option was never found and the click branch never ran. Otherwise the usual stale-prose/temp-dir-prefix/mock-domain cleanup (scholiq_test_* -> learniq_test_*, https://scholiq.example -> https://learniq.example, etc.), plus fixing PortalContributionProviderTest to assert 'Learniq' (matching PortalContributionProvider.php's already- renamed manifest label — the two had drifted out of sync mid-rename). Deliberately left unchanged: fixture data mirroring protected production literals (the 'Scholiq/materials/...' mock file paths matching the production NC-Files-folder-prefix decision, scholiq-cohort-* group-name fixtures), the historical/documents-the-rename-itself mentions, GitHub issue shorthand (scholiq#35, scholiq#265), and @e2e/@SPEC tags paired with real openspec/ anchors.
…root config Renames the remaining "Scholiq" prose in routes.php's AppHost-adoption comments to "Learniq" (the app's own name, its URLs, its bespoke SettingsController). Renames SCHOLIQ_DOCS_CAPTURE -> LEARNIQ_DOCS_CAPTURE in the root playwright.config.ts, matching tests/e2e/playwright.config.ts's comment and the env var tests/bootstrap already reads. Left unchanged (deliberate, out of scope for this pass): the literal old register-slug/app-id/app-config-namespace values in routes.php's 'scholiq-ai-features' AVG code and 'scholiq-native JSON' format mentions, and appinfo/info.xml's codeberg.org/Conduction/nextcloud-scholiq URLs — those are an external repo-hosting decision, not code-identifier residue, and changing them without confirming the remote was actually renamed would just replace one wrong URL with another.
The naming sweep touched this file, so gate-16 saw the method as changed. Excluded with a reason: it answers 'is this event about one of our objects' and returns '' for every negative case, so callers bail out. The register it matches against is the app id - which is exactly why the rename's diff surfaced it.
development ended up with the namespace rename but NOT the app identity:
Application.php declares APP_ID 'learniq' and namespace OCA\Learniq, the
register is learniq_register.json, CI passes app-name: learniq - while
appinfo/info.xml still said <id>scholiq</id> and <namespace>Scholiq</namespace>.
Nextcloud resolves OCA\{namespace}\AppInfo\Application from info.xml, so
that combination cannot boot the app at all.
Cause: the GitHub-side merge ca67455 resolved info.xml to development's
side, reverting all 100 lines. The later release commit only touched
<version>, so the revert predates it. Because that resolution is now an
ancestor, a plain merge silently takes development's file again - which is
what happened here before this commit.
Restores the Learniq info.xml (id, namespace, repair steps, learniq
register references, and the <=128-char summaries the App Store schema
requires) while KEEPING development's release version so the release
automation is not fought.
Also carries the e2e guard for OC.generateUrl: reading it straight after
goto throws an opaque TypeError on Nextcloud's maintenance and login
pages, which both return a normal 200. Observed 2026-08-19 - a concurrent
session ran occ, the instance went into maintenance for under a minute,
and 15 tests failed pointing at application code.
Its docblock justified matching only the 'scholiq' slug by claiming the step runs BEFORE RenameRegisterSlug 'because info.xml lists it first'. That is false: appinfo/info.xml lists RenameRegisterSlug FIRST and RenameDutchColumns LAST. So by the time it ran, the slug was already 'learniq', its LIKE 'scholiq%' lookup matched zero registers, and the step reported success while migrating nothing. Now matches BOTH prefixes, which removes the dependency on step order entirely - an ordering assumption stated only in a comment is enforced by nothing. Also clears the three phpcs errors CI flagged (doc long-description capitalisation in the three repair steps) and prettier-formats the visual spec. phpcs errors: 3 -> 0. Repair-step tests still 11/11.
Contributor
Quality Report — ConductionNL/scholiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ❌ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| format | ❌ | ||||
| composer | ✅ | ✅ 104/104 | |||
| npm | ✅ | ✅ 634/634 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-19 23:23 UTC
Download the full PDF report from the workflow artifacts.
Contributor
Quality Report — ConductionNL/scholiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| format | ✅ | ||||
| composer | ✅ | ✅ 104/104 | |||
| npm | ✅ | ✅ 634/634 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-19 23:53 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Aug 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
development is currently broken
developmenthas the namespace rename but not the app identity:lib/AppInfo/Application.phpnamespace OCA\Learniq,APP_ID = 'learniq'lib/Settings/learniq_register.json.github/workflows/*app-name: learniqappinfo/info.xml<id>scholiq</id>,<namespace>Scholiq</namespace>Nextcloud resolves
OCA\{namespace}\AppInfo\Applicationfrominfo.xml. WithScholiqthere andOCA\Learniqin the code, the app cannot boot at all.How it happened
The GitHub-side merge
ca67455resolvedappinfo/info.xmlto development's side, reverting all 100 lines. The later release commit4e176beonly touched<version>, so the revert predates it — I checked, rather than assuming the release automation did it.Because that resolution is now an ancestor, a plain
git merge origin/developmentsilently takes development's file again. That is exactly what happened on this branch before this commit, which is how I found it.What this does
Restores the Learniq
info.xml—<id>,<namespace>, the repair steps (RenameRegisterSlug,MigrateAppConfigKeys), thelearniq_register.jsonreferences, and the ≤128-character summaries the App Store schema requires — while keeping development's release version (0.1.1-unstable.20260819175834) so the release automation is not fought.Also carries an e2e guard: reading
OC.generateUrlstraight aftergotothrows an opaqueTypeErroron Nextcloud's maintenance and login pages, both of which return a normal 200. Observed 2026-08-19 — a concurrent session ranocc, the instance went into maintenance for under a minute, and 15 tests failed pointing at application code. The guard now names the environment cause instead.Verified locally
/apps/learniq/→ 200, nav renders 24 top-level entries, Compliance present,primaryRoleresolves under thelearniqapp idlearniq; canaryGradeEntry d4caa278field fingerprint unchanged (6ca294bb6174…);table_name ~ 'oc_openregister_table_[a-z]'still 0Course200, is refused another learner'sGradeEntry404 (OR masks read denials), create 403 — with admin's 200 on the same object as the positive controlext-zip, no openregister), not codeeslint0 errors ·stylelintcleanCOVERAGE: 63 of 63 applicable gates ranNote on the local instance
installed_versionwas0.3.0while the release train moved to0.1.1-unstable…. Nextcloud refuses a downgrade and 503s the whole instance withneedsDbUpgrade: true. Realigninginstalled_versioncleared it. Worth knowing before anyone else pulls this.🤖 Generated with Claude Code