From f3cd98e1d02ade493a5b0f3821f93b50541b1153 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Thu, 10 Sep 2026 19:41:36 +0200 Subject: [PATCH 1/2] docs(dev-env): a PHP coverage driver is a prerequisite, not an optional extra phpunit.xml sets failOnRisky and beStrictAboutCoverageMetadata, and both are inert without a coverage driver. A test that executes a class its @covers block does not name is risky, and risky is exit 1 in CI, where a driver is loaded. Without one locally the check cannot fire at all: composer check:strict passes and the suite prints 'OK, but there were issues!', which reads like a pass to anyone reading the summary line rather than the exit code. On 2026-09-10 that reddened every PHPUnit cell in dossiq and pipelinq within the same hour, on development, for the same reason. Neither author could have seen it before pushing. Adding a collaborator to an existing test is an ordinary edit that looks nothing like touching coverage metadata. Refs #746. --- docs/development-environment.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/development-environment.md b/docs/development-environment.md index 36a5985b..2bf91aec 100644 --- a/docs/development-environment.md +++ b/docs/development-environment.md @@ -5,6 +5,27 @@ Shared Docker Compose setup for all ConductionNL Nextcloud app development. The ## Prerequisites - Docker and Docker Compose v2+ +- **A PHP coverage driver.** Install it once: + + ```bash + sudo apt install php8.3-pcov # match your PHP; php -v tells you + php -m | grep -E '^(pcov|xdebug)$' # must print something + ``` + + This is not only for coverage reports. `phpunit.xml` sets `failOnRisky` and + `beStrictAboutCoverageMetadata`, and **both are inert without a driver**. A + test that executes a class its `@covers` block does not name is risky, and + risky is exit 1 — in CI, where a driver is loaded. Without one locally the + check cannot fire, `composer check:strict` passes, and the suite prints + `OK, but there were issues!`, which reads like a pass to anyone looking at + the summary line instead of the exit code. + + On 2026-09-10 that reddened every PHPUnit cell in two repos within the same + hour, on `development`, for the same reason: dossiq's `EngineTaskInboxTest` + executing `EngineInboxQuery`, and pipelinq's `ConnectorEgressTest` executing + `ConnectorSourceRegister`. Neither author could have seen it. Adding a + collaborator to an existing test is an ordinary edit that looks nothing like + touching coverage metadata. See `.github#746`. - The workspace directory should contain all app repos as siblings of `.github/`: ``` apps-extra/ From c0b89a83c01949cf9f37c8d4675be96015102c2c Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 14 Sep 2026 10:07:11 +0200 Subject: [PATCH 2/2] docs(dev-env): drop the em-dash from the coverage driver note --- docs/development-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development-environment.md b/docs/development-environment.md index 2bf91aec..aabad757 100644 --- a/docs/development-environment.md +++ b/docs/development-environment.md @@ -15,7 +15,7 @@ Shared Docker Compose setup for all ConductionNL Nextcloud app development. The This is not only for coverage reports. `phpunit.xml` sets `failOnRisky` and `beStrictAboutCoverageMetadata`, and **both are inert without a driver**. A test that executes a class its `@covers` block does not name is risky, and - risky is exit 1 — in CI, where a driver is loaded. Without one locally the + risky is exit 1 in CI, where a driver is loaded. Without one locally the check cannot fire, `composer check:strict` passes, and the suite prints `OK, but there were issues!`, which reads like a pass to anyone looking at the summary line instead of the exit code.