Skip to content

Release: merge development into beta #286

Release: merge development into beta

Release: merge development into beta #286

Workflow file for this run

name: Code Quality
on:
push:
branches: [main, development, feature/**, bugfix/**, hotfix/**]
pull_request:
branches: [main, master, development, beta]
workflow_dispatch:
jobs:
quality:
uses: ConductionNL/.github/.github/workflows/quality.yml@main
with:
app-name: app-template
php-version: "8.3"
php-test-versions: '["8.3", "8.4"]'
nextcloud-test-refs: '["stable31", "stable32", "stable33"]'
enable-psalm: true
enable-phpstan: true
enable-phpmetrics: true
enable-frontend: true
enable-eslint: true
enable-phpunit: true
enable-newman: true
# `src/manifest.json` declares `"dependencies": ["openregister"]`, and
# nc-vue's CnAppRoot honours that at runtime: when a declared dependency
# app is not enabled it renders the "Required apps are missing" gate
# INSTEAD of the router outlet. That gate has no <main>, no
# `#app-navigation-vue`, and no `.cn-widget-wrapper` — so on a bare CI
# Nextcloud every app-shell assertion fails with "element(s) not found"
# while the app itself is behaving exactly as designed. The app mounts
# fine (the CnAppRoot / manifest-prop test passes); it simply refuses to
# render an app whose backing store is absent.
#
# So the dependency has to exist in the e2e instance, not be asserted
# around. Checked out and `occ app:enable`d by the shared workflow.
additional-apps: '[{"repo":"ConductionNL/openregister","app":"openregister","ref":"main"}]'
enable-sbom: true
# tests/e2e/app-shell.spec.ts is small (7 tests) but every one of them
# exists because the Vue 2 -> Vue 3 migration can break it SILENTLY:
# a failed `createApp().mount()` leaves the server-rendered container in
# place, an unregistered icon paints nothing rather than a fallback,
# a tree-shaken widget registration renders `.cn-unknown-widget` with an
# empty console, and Vue Router 4's dropped `path: '*'` leaves <main>
# blank with no 404. None of those produce an error a unit test or a
# build could see — they only differ from "working" under a browser.
#
# This is the app every Conduction app is scaffolded from, so a silent
# break here propagates to the whole fleet on the next `app-create`.
#
# `playwright-test-path` stays at its default (`tests/e2e`); the root
# `playwright.config.ts` is used, whose `chromium` project depends on the
# `setup` project for auth and testIgnores the journeydoc capture spec.
enable-playwright: true
# ── Frontend Check legs ──────────────────────────────────────────────
# `frontend-checks` defaults to `[]`, and an empty list means the shared
# workflow emits NO "Frontend Check" job at all — so this repo's validator
# family ran nowhere while the run still looked complete. That matters
# more here than anywhere else: this repo is the template every new
# Conduction app is scaffolded from, so a validator that is dark here is
# dark in every app created from it.
# `check:specs` is the aggregate (json-strict + manifest-v2 + register +
# registry), listed as ONE leg rather than four because each leg is a
# fresh job with its own checkout + `npm ci`. `check:manifest` is separate:
# it is not part of that aggregate.
# Measured on this tree before enabling: `check:specs` PASSES,
# `check:manifest` FAILS (`pages[4].type: "roadmap" not in v1.1 enum`).
frontend-checks: '["check:specs", "check:manifest"]'
# ── Coverage ratchet ─────────────────────────────────────────────────
# `enable-coverage-guard` defaults to FALSE, which is why both
# "Coverage Baseline Protection" and "Coverage Baseline Check" have only
# ever reported `skipped`. It needs two inputs this repo did not have,
# both added in this commit: `scripts/coverage-guard.php` (byte-identical
# to openregister's) and `.coverage-baseline` = 23.55, this repo's own
# measured coverage (81 of 344 statements) read from clover.xml in the
# `coverage-report` artifact of run 30911186142.
enable-coverage-guard: true
# ── Hydra mechanical gates ───────────────────────────────────────────
# `enable-hydra-gates` defaults to FALSE, so this tier has never executed
# here — the job reported `skipped`, which the Quality Report renders
# identically to a pass. Again, this is the scaffold template: a gate that
# is off here is off in every app generated from it.
# Pinned to v1.0.1 so a change to the gate package cannot move this repo's
# verdict without a commit here.
# `enable-axe` deliberately NOT set: a vanilla Nextcloud 34 already carries
# serious/critical violations from core's own UI.
#
# v1.0.1 -> v1.3.0 (ConductionNL/.github#159). Two defects, one bump.
#
# 1. STALE. v1.0.1 is `f4d9756` (2026-08-03) and predates three gate
# fixes, so every Hydra Gates run this repo has ever made executed a
# script in which 16 gates reported PASS when their helper never ran
# (#147), gate-33 had no axe report to read and never said so (#148),
# and gates 6 and 7 reported PASS on an EMPTY scope (#149). A gate
# that reports PASS without running emits a tick identical to a real
# one, which is why nothing in this repo's history shows it.
#
# 2. RED. quality.yml is referenced `@main` while this package is
# PINNED, so the two can desync — and on 2026-08-05 they did. #164
# flipped `hydra-gates-require-full-coverage` to default TRUE, but
# the accounting that makes that flag survivable (NOT APPLICABLE, as
# distinct from a structural or a wiring gap) ships in the PACKAGE.
# So every pin older than `f7eaf2a` now fails the coverage assertion
# for gates it has no subject matter for. Measured diff-scoped,
# exactly as CI scopes it:
# v1.0.1 exit 98 FAIL — "GATES THAT DID NOT RUN: 24 33"
# v1.3.0 exit 0 PASS — those gates named NOT APPLICABLE
# The old pin was not merely stale, it was failing this repo's CI for
# a reason that had nothing to do with this repo.
#
# v1.3.0 is `f7eaf2a` = .github@main, tagged so the ref stays
# reproducible and a later gate change cannot move this repo's verdict
# without a commit here.
enable-hydra-gates: true
hydra-gates-ref: v1.3.0