Skip to content

ci: restore the Code Quality gate (baseline probe — do not merge yet) - #238

Closed
rubenvdlinde wants to merge 1 commit into
developmentfrom
ci/quality-workflow-ref-baseline
Closed

ci: restore the Code Quality gate (baseline probe — do not merge yet)#238
rubenvdlinde wants to merge 1 commit into
developmentfrom
ci/quality-workflow-ref-baseline

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Why this exists

.github/workflows/code-quality.yml calls Conduction/.github/.github/workflows/quality.yml@main. That repository is not reachable from Actions, so every run of this workflow produces ZERO jobs and fails immediately with "This run likely failed because of a workflow file issue".

Verified, not inferred:

run sha jobs
30662597273 (2026-07-31) 0b6a68f 0
30571339410 (2026-07-30) e3ae6d8 0
30381265885 (2026-07-28) a9cd6e7 0
26435394788 (2026-05-26) d7df70a 20 ← positive control

Introduced by e2faa09 (2026-06-01) — "point reusable workflows at Conduction/.github (org rename)". The rename went the wrong way: the shared workflows live in ConductionNL/.github (public, readable), and every app that references that spelling gets its jobs (openregister → 24, openconnector → 22).

So since 2026-06-01 larpingapp has had no ESLint, PHPCS, PHPMD, PHPStan, license/security scan or PHPUnit (4-way NC/PHP matrix) on any push or PR.

What this PR does

One line, one file: Conduction/.githubConductionNL/.github in code-quality.yml.

It is deliberately cut from an untouched development so that whatever the restored gate reports here is the true pre-existing baseline, to be compared against the Vue 3 migration PR.

Not fixed here

The other 7 workflows in this repo carry the same wrong reference (branch-protection, documentation, issue-triage, openspec-sync, release-beta, release-stable, sync-to-beta), and so do 6 other fleet appspipelinq, procest, opencatalogi, docudesk, softwarecatalog, decidesk, openbuild.

Reference-only change on top of an otherwise untouched `development`, so
the Vue 3 migration PR has a like-for-like baseline to be compared against.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/larpingapp @ eb47943

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 94/94
npm ✅ 315/315
PHPUnit
Newman ⏭️
Playwright ⏭️

Coverage: 0% (0/17 statements)


Quality workflow — 2026-07-31 21:24 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde added a commit that referenced this pull request Jul 31, 2026
…ure)

The shared `features-extract` job that regenerates this file is skipped on
pull_request, and on a push to development its bot commit is rejected by
branch protection (ConductionNL/.github#61), so the file has been drifting
from openspec/specs/ with nothing able to correct it. Regenerated with
ConductionNL/.github scripts/extract-features.py; `--check` is now clean.

Pre-existing: the same failure reproduces on an untouched development in
the baseline probe (#238).
rubenvdlinde added a commit that referenced this pull request Aug 1, 2026
…1.0-vue3.13) (#239)

* feat(vue3): migrate larpingapp to Vue 3

- deps: vue 3.5, @nextcloud/vue 9, vue-router 4, @nextcloud/dialogs 7,
  @conduction/nextcloud-vue pinned exactly to 2.1.0-vue3.13
- lint: adopt the shared conductionVue3Fixes preset (spread last)
- bootstrap: createApp/app.use, vue-router 4 catch-all, reactive()
- webpack: vue-router$ singleton alias, entry-FILE aliases for the
  exports-map-only @nextcloud/vue and @nextcloud/dialogs
- remove dead Vue-2 files (jest.config.js, MainMenu.vue, UserSettings.vue)

* fix(e2e): centralise the base URL and drop every localhost:8080 fallback

playwright.config.ts, global-setup.ts, workflows/fixtures.ts and
detail-forms-admin.spec.ts each computed their own `?? localhost:8080`
default. :8080 is the SHARED dev container, so the fixture WRITE paths
seeded registers/schemas/objects into other people's environment, and a
spec could create a fixture on one instance and open it on another.

tests/e2e/_base-url.ts is now the single resolver: PLAYWRIGHT_BASE_URL >
NEXTCLOUD_URL > NC_BASE_URL, and it THROWS when none is set.

Also fixes the remaining lint warnings (JSDoc @param types/descriptions).

* fix(webpack): derive publicPath at runtime; fix(ci): restore the shared workflow refs

webpack: @nextcloud/webpack-vue-config hardcodes output.publicPath to
/apps/<app>/js/. An app deployed into Nextcloud's second apps path is
served from /custom_apps/, so every LAZY chunk 404s, comes back as the
text/html error page, is refused on MIME grounds and kills the page with
a ChunkLoadError. The entry bundle is fine (NC writes that tag itself),
so nothing in the build reports a problem. publicPath 'auto' derives it
from the URL the entry script actually loaded from.

ci: all 8 reusable-workflow calls pointed at Conduction/.github, which
Actions cannot resolve. Every Code Quality run since 2026-06-01 produced
ZERO jobs. The shared workflows live in ConductionNL/.github.

* style(skill-tree): satisfy rule-empty-line-before (pre-existing stylelint failure)

Four single-line rule blocks tripped `rule-empty-line-before`. The failure
is pre-existing and was invisible because the Code Quality workflow had
produced zero jobs since 2026-06-01.

* docs: regenerate docs/features.json (pre-existing Features Check failure)

The shared `features-extract` job that regenerates this file is skipped on
pull_request, and on a push to development its bot commit is rejected by
branch protection (ConductionNL/.github#61), so the file has been drifting
from openspec/specs/ with nothing able to correct it. Regenerated with
ConductionNL/.github scripts/extract-features.py; `--check` is now clean.

Pre-existing: the same failure reproduces on an untouched development in
the baseline probe (#238).

* fix(e2e): resolve register/schema ids from the app's settings API

detail-forms-admin.spec.ts hardcoded register 8 and schemas 18-25 with a
comment saying '8 on the dev instance'. On any other instance LarpingApp's
register imports with a different id (15 on a fresh NC 34 install, with a
different schema assignment), so every seed POST 404s, seedObject()
swallowed it, the ids became the literal 'seed-missing', and eight specs
failed 60s later as TIMEOUTS — which reads like a rendering regression.

Now resolved at runtime from /apps/larpingapp/api/settings, the same
source workflows/fixtures.ts and the SPA itself use, honouring the
per-type <type>_register over the shared one. Explicit LARPING_* env
vars still win. seedObject() now reports the status and body on failure
instead of returning null silently.

* fix(dashboard): call registerBuiltinDashboardWidgets() at bootstrap

nc-vue declares `sideEffects: ["**/*.css"]` (ADR-061), so webpack may
legally drop registerDashboardWidgets.js's bare side-effect imports. The
manifest's `stat` KPI tiles and `object-table` lists are registered ONLY
that way, so getWidgetTypeEntry() missed and CnDashboardPage rendered its
'Widget not available' placeholder for 5 of the 7 dashboard widgets.

The one widget that did render, `chart`, is registered by an INLINE
registerDashboardWidget() call that tree-shaking cannot reach — which is
what identified the mechanism. The library ships this explicit no-op for
exactly this purpose.

* fix(webpack): refuse to alias a MAJOR-mismatched local nc-vue checkout

The USE_LOCAL_LIB alias is opt-OUT and silently overrides the exactly
pinned @conduction/nextcloud-vue dependency. The shared
apps-extra/nextcloud-vue checkout sits on wip/cnindexpage-export-action
at 1.0.0-beta.184 — the Vue 2 line — so any build run from
apps-extra/larpingapp would have compiled Vue 2 library sources into
this Vue 3 app, successfully, with the first symptom appearing at
runtime as a migration bug.

Now the alias is used only when the local checkout's major matches the
pinned dependency's; a mismatch throws with the versions named.
USE_LOCAL_LIB=false still disables it outright.

* fix(e2e): dismiss the onboarding tour, not just an aria-label=Close button

The app's first load opens a six-step onboarding tour ('Welcome to
LARPing') whose controls are labelled 'Close tour' and 'Skip'. All five
copies of dismissSupportDialog matched only button[aria-label="Close"],
so the tour stayed open across the viewport.

Measured on the isolated instance: two live [role="dialog"] nodes, two
modal masks, and elementFromPoint(innerWidth/2, innerHeight/2) returning
the tour's <video>. The page underneath renders perfectly, so
toBeVisible() keeps passing while every locator.click() hangs on
actionability until the test times out — which reads like a rendering
regression and is really an undismissed overlay.

One implementation now lives in _nav.ts and the five duplicates import
it; it closes any visible dialog by the labels actually used, repeating
until none remains (the tour and its step controls are two dialogs).

* fix(e2e): drop the last unsatisfiable networkidle wait in gotoDetail

Every other mention of networkidle in this suite is a comment saying
never to use it (ADR-074 rule 4 — Nextcloud's notification poll keeps the
network permanently busy). One live call survived, in the gotoDetail
helper backing every character-detail spec.

The trailing .catch(() => {}) made it look safe. It is not: the call
takes no timeout, so it inherits the unbounded navigation timeout and
never settles; the TEST times out at 60s first and the catch never runs.
The failures surface as 'Test timeout of 60000ms exceeded', which reads
like a slow or broken page instead of a wait that can never succeed.

Replaced with the app-content visibility wait used everywhere else.

* docs(e2e): record the verified cause of the detail-page blocker

Re-verified on a clean isolated NC 34 instance, as the note itself asked.

The cause is a MISSING player SCHEMA. larpingapp_register.json declares
ten schemas including 'player'; after import the register holds nine —
item/event/attendance arrive prefixed (larping_*) and player is dropped
entirely, leaving player_register and player_schema empty in app config.

The character schema REQUIRES ocName, typed format:uuid with $ref:player.
With no player schema there is no player UUID, so the OR API rejects
every character create. seedObject() swallowed it, ids became the string
'seed-missing', and every character-detail spec failed 60s later as a
timeout. Register-import side, not the test layer.
@rubenvdlinde

Copy link
Copy Markdown
Contributor Author

Closing as superseded — both the change and its purpose have landed.

The one-line fix is already on development. #261 (ci(quality): enable the Code Quality gates this repo was silently skipping, merged 2026-08-04) corrected the shared-workflow reference. Verified just now against development — all eight callers spell it ConductionNL/.github, including the code-quality.yml line this PR touched:

branch-protection.yml :: ConductionNL/.github/.github/workflows/branch-protection.yml@main
code-quality.yml      :: ConductionNL/.github/.github/workflows/quality.yml@main
documentation.yml     :: ConductionNL/.github/.github/workflows/documentation.yml@main
issue-triage.yml      :: ConductionNL/.github/.github/workflows/issue-triage.yml@main
openspec-sync.yml     :: ConductionNL/.github/.github/workflows/openspec-sync.yml@main
release-beta.yml      :: ConductionNL/.github/.github/workflows/release-beta.yml@main
release-stable.yml    :: ConductionNL/.github/.github/workflows/release-stable.yml@main
sync-to-beta.yml      :: ConductionNL/.github/.github/workflows/sync-to-beta.yml@main

That also resolves the "Not fixed here" list in the description — the other seven callers named there were fixed too, not just code-quality.yml.

The baseline this probe existed to capture is moot. It was cut from an untouched development specifically to measure a pre-Vue-3 baseline "to be compared against the Vue 3 migration PR". That migration is #239, merged 2026-08-01 — four days before now. There is no longer a before-state to compare against, which is exactly why the PR said do not merge yet: it was never meant to land, only to measure.

Mechanically it is also unmergeable in its current form (CONFLICTING/DIRTY), because development rewrote the same line it changes.

Since it landed, the gate has moved on twice more: #248 turned on the shared Playwright job and #269 moved hydra-gates-ref v1.0.1 → v1.3.0. Nothing in this branch is still needed.

Closed as obsolete, superseded by #261.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant