Release: merge development into beta - #477
Conversation
#478) The PHPUnit cell that runs the coverage ratchet fails with "scripts/coverage-guard.php predates merge-base comparison (it does not report the 'against' capability)". That message names a plausible cause rather than the measured one, but the underlying fact is simple: this copy is the 17,288-byte version and the workflow is written against the 35,733-byte canonical one, which additionally reports `deletion-neutral`. Without that capability, deleting well-tested dead code still reads as a coverage drop. Measured across the 21-app fleet: 8 apps already carry the canonical copy and their ratchets run and report normally; 11 carry a stale variant. This is vendored-copy drift, the same shape as the six drifted app-manifest schemas. Copied verbatim from ConductionNL/.github at quality-config/coverage-guard.php rather than patched locally. Reimplementing a gate has cost us before: a hand-rolled version found 1 finding where the real gate found 13.
This repo carries a copy of hydra's clean-env skill, and the copy told you to run `bash .claude/scripts/clean-env.sh` -- a file that does not exist here, in hydra, or in any other checkout. Its app list was five names long against a fleet of twenty-one, and three of those five (softwarecatalog, docudesk-era names, mydash) are app directories or retired apps rather than app ids, so following it by hand enables nothing. Synced from hydra's canonical version. It now drives `.github/dev-up.sh`, and its verification section names what to actually check: an app enables successfully with no vendor/autoload.php and then fatals on every request, and enables successfully with a pre-rename JS bundle and then renders a blank page. Both were true of live apps in this workspace on 2026-08-27, and "confirm apps are listed and enabled" sees neither. Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-27 16:51 UTC
Download the full PDF report from the workflow artifacts.
* feat(nav): give buildiq a settings section with Flows buildiq had no settings section at all - five menu entries, three main and two footer - and no flow surface, so a buildiq flow could only be reached through OpenRegister's list. Adds the fleet-standard entry (icon Sitemap, order 96, section settings) and the two pages it routes to. Shape copied from dossiq, opencatalogi, filinq and launchpad rather than invented, so list and status semantics stay identical across the fleet - a flow lives in OpenRegister's ONE native flow store, and every app's surface is a view onto the same rows. No dependency change needed: buildiq is already on @conduction/nextcloud-vue 2.19.0, which is the first release whose runtime registers the `flows` / `flow-detail` page types. Verified by looking for the quoted page-type key in the shipped bundle rather than trusting the version number - below 2.19.0 that string appears only in the stylesheet, so a manifest naming the type renders nothing at all rather than failing. The `Sitemap` icon is imported and exported in src/icons.js, so it renders. An unregistered icon renders as NOTHING rather than erroring, which is why that is checked rather than assumed. Deliberately uses the currently PUBLISHED page types. nextcloud-vue#800 (merged to development, unreleased) replaces the list half with `type: "index"` + `config.entitySource: "flows"`, which removes the need for a `flows` page type at all. The whole fleet migrates together once that releases; shipping buildiq on a type it cannot yet resolve would give it an empty page today. * chore: re-run CI after a transient composer-audit result gate-4 (composer-audit) failed, and the evidence says it is not reproducible rather than that a dependency is vulnerable: - Hydra Gates ran TWICE on this same branch and disagreed with itself: SUCCESS at 12:59:41, FAILURE at 13:11:07, with no push between them. - This PR changes one file, src/manifest.json, which cannot introduce a composer advisory. - `composer audit --locked` against this branch's own lock reports "No security vulnerability advisories found", as does development's. composer-audit queries a live advisory feed, so identical code can get different verdicts minutes apart - a feed hiccup, a rate limit, or an advisory published and withdrawn. The gate's detail log lives on the runner and is not retrievable after the fact, so the cause cannot be pinned down from here; what can be established is that it does not reproduce. `gh run rerun` refuses these workflows, hence an empty commit. --------- Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
The App Store keys everything on the app id, so renaming <id> to buildiq made it a brand new store entry starting from nothing. The release workflow derives its version baseline from the git tags and info.xml of THIS repo, neither of which knows anything about what shipped as openbuild -- so the version line restarts below it. filinq was about to publish 0.0.40 while docudesk sits at 0.1.0-beta.3 on the store. The store has no version ordering rule (_check_permission validates existence and ownership only), so that uploads with a 200 and is then never offered to anyone already on the higher version. previous-app-id folds the old entry's published versions into the baseline, so the renamed app picks the line up instead of restarting it.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-27 18:47 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-27 21:41 UTC
Download the full PDF report from the workflow artifacts.
#485 gave buildiq a settings section with Flows, which put `Flow` in the manifest. The manifest is data the renderer walks rather than source the l10n extractor scans, so it never reached the catalogue and rendered English for a Dutch user. Maps to itself: Dutch Nextcloud keeps the product term, and decidiq, dossiq, openregister, keepiq, portaliq, pipelinq and filinq all already carry `Flow -> "Flow"`. Matching the fleet beats inventing a Dutch word for a feature name nobody uses one for. This is the third time today the same gap has produced a regression within hours of a sweep: keepiq via #448, and now this. `check:l10n-js` cannot catch it and did not — nl.json and nl.js were in sync at 1,045 keys each, both simply missing the string. That check guards source-versus-artifact drift; this is manifest-versus-catalogue coverage, and only humaniq runs a check that asserts it. Verified: 0 manifest strings left without Dutch, keys DROPPED = 0, check:l10n-js PASS.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 05:33 UTC
Download the full PDF report from the workflow artifacts.
#510) Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 09:42 UTC
Download the full PDF report from the workflow artifacts.
* feat(demo): generated demo data for every schema (ADR-111 rules 1-2)
This app declares schemas and shipped no demo data, so it opened on an empty
list: the person evaluating it had to author objects by hand against a schema
they did not know yet. Fleet-wide, 562 of 598 schemas were in that state.
🔴 GENERATED, NOT WRITTEN. Every value is derived from the schema that will
validate it — `enum` picks from the enum, `pattern` is satisfied, `format`
drives the shape, `minimum`/`maxLength` are honoured, `required` is always
populated. Hand-written demo data is wrong in a way nobody sees until the demo
(a status outside its own enum, a required field omitted) and it fails at
import, in front of whoever asked for the demo.
Produced and validated by the single file gate-99 also runs:
`vendor/conduction/hydra-gates/scripts/lib/generate_mock_register.py`.
`--keep` preserves curated objects and tops up only what is short.
🔴 IT DOES NOT INSTALL ITSELF (ADR-111 rule 3). `x-openregister.type: mock` is
imported ON DEMAND — sample data appearing on a production instance because
somebody upgraded is a data-integrity incident, not a convenience:
occ openregister:descriptors:list --app=<app> --import=<register>
The setup-wizard step offering this on first run (ADR-111 rule 4, gate-100)
follows once OpenRegister's shared installer lands — deliberately not
twenty-one copies of the same logic.
Verified: `--check` re-validates every object against its own schema with
jsonschema and reports zero findings.
* fix(demo-data): generate against the whole schema, not the file that sorts first
A schema defined across more than one file was truncated to whichever file
sorted first, so the demo data satisfied half a schema. pipelinq's `ticket`
is the clear case: a base definition plus a CTI overlay whose own comment
says the overlay must land there "or OpenRegister's magic-table columns for
these fields never exist". The generator kept one half and discarded the
other, and both outcomes produce valid-looking objects against a real
schema, so nothing complained.
Definitions are now merged across files (properties and `required` unioned),
which is the "an extended schema extends its base" semantics the descriptors
already assumed. Regenerated and re-validated: no schema lost, coverage
unchanged, every object still validates.
* fix(demo-data): attribute the descriptor to the app id, not the directory
`x-openregister.app` is what the descriptor inventory resolves a register to
an app by, and the generator was writing the CHECKOUT DIRECTORY name into it.
Five of eight apps already ship an `<id>` that differs from their directory —
larpinq, learniq, humaniq, decidiq, buildiq — so those descriptors named an
app that does not exist, and the `occ openregister:descriptors:list --app=…`
command printed in their own description resolved nothing. A cross-app id is
a runtime lookup: it does not error, it silently finds nobody.
The id now comes from `<id>` in appinfo/info.xml, the stated authority,
falling back to the directory name only when there is no info.xml. The output
file is renamed to match and the directory-named one removed, so exactly one
mock descriptor remains per app — two would import demo data twice.
Register slugs are untouched: those are frozen per app.
* feat(setup): offer the demo data as the first setup step (ADR-111 rule 4)
An app installed from the App Store opens on an empty list, and the only
question its first reader has is whether they can see it work. Answering it
needs data they cannot author, against a schema they do not know yet. A
welcome screen answers a question nobody asked; it can still say hello from
second place.
`DemoDataService` imports this app's generated mock register through the same
OpenRegister importer the app already uses for its real configuration. Two
decisions worth stating:
- `force: true`. OpenRegister version-gates a non-forced import and SKIPS
silently when the version has not moved. An operator who asks for demo data
and is told it worked, on an instance where nothing was written, has been
lied to by a version compare. The request is explicit, so the import is.
- Its own config identity (`<app>.demo`), so the demo import and the real
configuration import cannot mask one another's version gate.
`skip-demo-data` exists so "no thanks" is a decision the wizard can record —
otherwise the only way past the step is to install demo data, which is wrong
on a production instance. The status flag records that the step was DEALT
WITH, not that demo objects exist.
The cross-app getter returns `object`, not the OpenRegister class: naming a
class from an optional app in a native return type makes PHP resolve it on
every return, so an instance without OpenRegister fails with a TypeError
about a class nobody mentioned instead of the RuntimeException that names the
missing app.
7 unit tests, 13 assertions. phpcs clean, manifest validates against
app-manifest-v2, gate-100 passes.
* fix(tests): pass DemoDataService where the SetupController constructor expects it
Adding `DemoDataService` to the constructor for ADR-111 rule 4 broke the
existing SetupController tests, and I did not grep for callers when I changed
the signature. buildiq's CI named it on all three NC versions:
TypeError: SetupController::__construct(): Argument #6 ($demoDataService)
must be of type OCA\Buildiq\Service\DemoDataService,
MockObject_SettingsService_f805ce68 given
A positional construction does not fail where the argument is missing — it
fails one slot LATER, reported as a type error on whatever now lands in the
wrong place. That is why it reads as a problem with $settings.
Swept all five apps that gained the step: three construct the controller in
tests. openbuild and opencatalogi positionally (opencatalogi twice — a
match-count assertion caught the second, which a single blind replace would
have missed), shillinq by named argument, where the new parameter is simply a
missing required one rather than a shifted slot.
Verified: openbuild 3 tests, shillinq 10, opencatalogi 16 — all green.
* fix(l10n): translate the demo-data step, and rebuild the browser catalogues
gate-99 (manifest-l10n-coverage) failed: the ADR-111 step's title and body had
no `l10n/nl.json` key, so a Dutch user would have read English in the first
step of the setup walkthrough.
Both strings added to nl.json and en.json, taken verbatim from each app's own
manifest rather than retyped, so the key always matches the string the gate
looks up. Wording follows what dossiq already shipped ("Demodata (optioneel)").
The compiled catalogues are rebuilt too. The JSON is the source; the browser
loads `l10n/*.js`, so translating only the JSON would have satisfied the gate
while still showing English to every actual user — the same source-vs-artefact
split that made dossiq's check:l10n-js go red earlier today.
Verified locally before pushing, not after: manifest-l10n-coverage 0 findings,
manifest-copy-style 0, setup-demo-data-first 0, manifest schema 0 errors,
check:l10n-js PASS, and shillinq's manifest budget still PASS.
* fix(l10n): keep the manifest strings in nl.json only
Adding the ADR-111 step's strings to en.json as well as nl.json broke two
checks in opposite directions, and neither is wrong:
larpinq test:l10n — en.json defines the required key set, so two new keys
obliged all 37 locale files to translate them.
opencatalogi check:l10n — flags keys in en.js that no t() call references.
A manifest string is not a t() call, so all three
counted as UNUSED.
One demands the key be everywhere, the other demands it be nowhere. Both are
satisfied by putting manifest strings in nl.json ONLY, which is also what
gate-99 actually asks for: it looks up `l10n/nl.json` and nothing else.
en.json is the SOURCE catalogue governed by t() extraction and locale parity;
a manifest string is neither extracted nor parity-tracked, so it does not
belong there.
Applied to all four apps rather than only the two that were red, so the rule
is uniform and the next locale added to any of them cannot reopen this.
Compiled catalogues rebuilt.
Verified per app, each against its own scripts: larpinq test:l10n PASS,
openbuild test:l10n PASS, opencatalogi check:l10n PASS, shillinq test:l10n +
test:l10n-parity PASS, check:l10n-js PASS everywhere, and
manifest-l10n-coverage 0 findings on all four.
* fix(demo-data): the mock no longer carries blocks that name PHP code
gate-56 (register-handler-resolution) resolves `handler`, `guard`, `requires`,
`save`, `fallbackGuard` and `preconditions` to real classes, and it reads
`lib/Settings/*register*.json` — which matches the generated mock.
shillinq failed with 6 unresolved references, all inside the mock: it named
`OCA\Shillinq\Consolidation\ConsolidationGuard`, a namespace no class uses,
while the real descriptor names `OCA\Shillinq\Service\ConsolidationGuard`,
which exists. The generator merges definitions across every component file, so
a lifecycle block from a non-canonical file was unioned into the copy.
The generator now strips those blocks (ConductionNL/.github#612): a mock exists
so demo objects have a register to live in and a schema to validate against,
not to describe a state machine. Regenerated here.
Verified: gate-56 0 findings, `--check` still passes every schema, and
shillinq's manifest budget still PASSes.
* fix(demo-data): the mock carries objects, not a second copy of every schema
The generated mock sits in `lib/Settings` and copied every schema definition,
so apps that assert their schemas are unique started counting two. shillinq
named it:
testExactlyOneOrderSchemaDefinitionExists
Failed asserting that actual size 2 matches expected size 1.
The copy was never needed: the importer resolves an object's schema by slug
when the descriptor omits it, and the real descriptor always imports first
(ADR-005 seeds it from a Repair step at install). Regenerated against
ConductionNL/.github#612 — the descriptor now declares its register and its
objects only.
Every object and schema still covered; `--check` passes unchanged.
---------
Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-28 10:53 UTC
Download the full PDF report from the workflow artifacts.
… one buildiq ships a Flows page and its tour never mentioned it, so the automation surface was discoverable only to someone who already knew it was there. This is the last of the fleet apps to get the stop; the other eight landed today. The step is `optional` with `allowManualNext`, deliberately: showing where flows are edited must not turn into "author an automation before you may finish the tour". Also bumps @conduction/nextcloud-vue to 2.21.0. That is not housekeeping — it is what makes the step work at all. The stop targets `Flows`, a SETTINGS-section nav entry, and CnAppNav did not emit `data-cn-route` on its settings loop until 2.21.0 (#811). Below that the target resolves to nothing, and CnWalkthrough SKIPS an optional step whose target is absent — silently, with the step counter unchanged. The step would have shipped and reached nobody. `npm ci` installs from the lock, so the caret range alone decides nothing. The three new strings are added to l10n/en.json and nl.json by hand: buildiq's own `test:l10n` does not read src/manifest.json (it reports OK with all three missing), so gate-101 in CI is the only thing that would have caught it. Verified: gate-70 rc=0 (0 findings), gate-96 rc=0, test:l10n OK, check:l10n-js rc=0.
gate-100 was CORRECTED on 2026-08-28. Its first version demanded `demo-data` at step 0 and treated `welcome` as "a question nobody asked"; the corrected rule puts `welcome` first and the demo-data offer second, because the setup wizard is the CONFIGURATION wizard and an orientation step earns its place there. buildiq led with `demo-data`, which the OLD rule called compliant and the corrected one fails. That ordering predates this branch — this PR only adds the Flows walkthrough stop — but gate-100 is diff-scoped on src/manifest.json, so touching the manifest at all pulls the setup declaration into scope. Fixing it here rather than leaving the branch red over an ordering it did not introduce. Nothing else changes: same five steps, same actions, same copy. Verified against the CURRENT checker (re-extracted from .github main — the copy I had cached was the pre-correction one and reported the opposite verdict): gate-100 rc=0, gate-70 0 findings, gate-96 rc=0, test:l10n rc=0.
feat(walkthrough): show where flows live, without making anyone build one
* refactor(manifest): the flow pages are an index and a flow `flows` and `flow-detail` are deprecated aliases. `flows` predates named index sources: a flow lives in OpenRegister's native flow table rather than a register/schema pair, so an object-backed index had nothing to bind to and the list needed a page type of its own. `config.entitySource` closes that, so the list is an ordinary `index` and only the EDITOR still needs its own type, now named `flow`. Behaviour is unchanged - both aliases resolve to the same components. The list page's `_note` is updated in the same commit: it asserted the old rationale (that an index "cannot address" a flow), which this change disproves. `config.app` is untouched and is load-bearing: the editor stamps it on a flow created there and the index filters on it. Requires @conduction/nextcloud-vue 2.21, where a named source's columns and create button are actually read. * chore(deps): bump @conduction/nextcloud-vue to ^2.21.0 The flow pages need 2.21.0: earlier releases DECLARE a named index source's columns, create button and row actions without reading them, so the migrated page renders a columnless table with no working create action. The lock is the part that matters. CI installs with `npm ci`, which honours package-lock.json and ignores how permissive the caret is — bumping the range alone would change nothing about what actually installs. * test(e2e): suppress the setup wizard, the third first-run overlay 38 specs across agents, applications and automations failed on this branch while the app was healthy: bundle served 200 at 14MB, every register and schema seeded, api/applications answered 200. The cause is an overlay. This script already suppresses the walkthrough and the support note, but the configuration wizard is a different mechanism - the manifest declares setup.completionConfigKey and CnAppRoot reads it from APP CONFIG, not from a per-user preference. It did not matter until nextcloud-vue 2.21. Before it, optionalSetupPending short-circuited on /api/setup/status reporting completed:true, so the wizard never opened and nothing had to suppress it. nextcloud-vue#806 fixed that bug; the wizard now opens as designed and lands a role=dialog aria-modal over every page. What made it hard to read: Playwright reports the target as found, visible, enabled and stable, then retries the click ~55 times against .modal-container__content until the test times out. It looks like a slow or flaky page, not a modal - the intercepting element only appears in the call log, not in the error message. Same principle as the preferences above: the product's own returning-user mechanism, not a per-spec dismissal. Non-fatal, so a failure leaves the wizard visible and the specs failing honestly. --------- Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 13:16 UTC
Download the full PDF report from the workflow artifacts.
Adds `buildiq-compose.yaml` and a setup page describing it. The compose brings up Postgres and Nextcloud, installs openregister (required), thematiq and integriq (optional) and buildiq from release tarballs, and enables them in dependency order. Nothing is bind-mounted: Nextcloud installs an app by deleting its directory and extracting an archive over it, so pointing that at a checkout deletes the working tree — measured on a development machine on 2026-08-27, where an app-store update fired on a container restart and removed every top-level file including .git. Release tarballs rather than a clone for a second reason: a tarball is a complete app carrying vendor/ and the built js/, and an app with no vendor/ does not fail loudly — it warns once and keeps loading, so it looks installed while every service needing a dependency is absent. The openregister dependency is not declared in appinfo/info.xml — no app in the fleet declares an <app> dependency — so the compose encodes what the manifest does not. Verified: docker compose config parses and interpolates; the same generated file was booted end to end for portaliq, which produced 17 registers, 86 schemas and 13 magic tables for its own register, with the portal content API returning a real site rather than an empty shell. Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 13:53 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-28 14:52 UTC
Download the full PDF report from the workflow artifacts.
… saw (#516) * fix(e2e): 26 skips carried their reason in a comment the report never saw The skip-discipline gate reports 39 V3 findings here — "a skip or fixme with no reason recorded". Every one of those 26 addressed in this commit already HAD a reason, and a good one. None of them reached the Playwright report, which is the only place the gate (or anyone) can read it. `test.skip('title', fn)` is the STATIC form: it records no reason at all. The reasons were sitting in comments, some above the declaration and some inside the body, saying things worth keeping: "SPEC DRIFT, not an environment limitation. The requirement describes ONE tabbed editor with Design (default) and Raw JSON as sibling tabs. The shipped app has no such pair…" "STUB BODY — needs real assertions. The buildiq#41 quarantine is stale: #41 MERGED 2026-07-27 and the builder UI renders." Each is lifted into `test.skip(true, '<reason>')`, the form the report carries. buildiq-runtime 11 nldesign-theme-selection 6 docudesk-document-templates 5 application-detail-overview 2 buildiq-rbac 2 NOTHING about what runs changes. The same 26 tests are excluded, for the same reasons, and the comments stay where they are. That property is the whole risk in this edit, so it is asserted rather than hoped for. Converting `test.skip(title, fn)` to `test(title, fn)` and then failing to insert the annotation SILENTLY STARTS RUNNING a test that was excluded on purpose — and it still compiles, so `--list` cannot catch it. The transform aborts unless every converted test gains an annotation, and it did abort on four files whose reasons lived above the declaration rather than inside it, until it was taught to look there. Verified: static `test.skip('…')` remaining 0 annotations added 26 diff lines that are neither a declaration nor an annotation: 0 npm ci rc=0 · prettier clean · lint rc=0 `playwright test --list` 272 tests across 55 files Remaining here after this: 13 V3 in files using other forms, 2 V2, and 5 V1 spec files that execute nothing. Part of ConductionNL/.github#609. * fix(e2e): the remaining reasonless exclusions, in four other forms The first pass converted 26 static `test.skip('title', fn)` calls. These are the rest, which used forms that pass did not match: test.describe / .skip(...) promoteDestructive 1 split across two lines by prettier, so searching for `test.describe.skip(` finds nothing test.describe.skip(...) export-zip 1 test.fixme(title, fn) virtual-app-crud 2 schema-crud 1 INDENTED test.skip(...) bootstrap-buildiq 1 inside a describe, chat-companion 1 so a column-0 anchor missed them Their reasons were as good as the first batch's, and equally invisible to the report: "MOVED TO NEWMAN: asserts on the manifest API response, not the UI. The API/contract is covered by tests/integration/*.postman_collection.json" "the call site that opens PromoteVersionDialog does not exist: every scenario here reaches it through TODO_PROMOTE_BUTTON_SELECTOR (promote-version-btn), which appears nowhere in src/" Final state of the branch, with comments excluded from every count so a comment mentioning `describe.skip` cannot be mistaken for a call: reasonless static test.skip('…') 0 reasonless static test.fixme('…') 0 reasonless test.describe.skip(…) 0 attributed annotations 40 diff lines that are neither a declaration nor an annotation: 0 272 tests across 55 files, unchanged · lint rc=0 · prettier clean NOT addressed, deliberately: the 5 V1 spec files that execute zero tests. hydra-console is the clearest and is NOT a spec defect — its guard is a real capability probe carrying a full reason, and it skips because `hydra-cache` (register 2512) is not provisioned on the CI instance. That is a seeding gap; closing it by editing the spec would be the wrong fix. * feat(openspec): track the AI streaming work the e2e skip was waiting for Two tests in chat-companion-streaming.spec.ts stood down on: Streaming surface not yet wired — see openspec/changes/ai-chat-companion-streaming/ That path did not exist. Not in this repo, not in .github, openregister or hermiq, and a fleet-wide code search finds the string referenced only by the skip message citing it. The tests were deferred to a tracker nobody had created, so nothing could ever close them. They also assert nothing: both bodies are empty, carrying a comment describing the intended assertion and no code. Enabling them as they stand would light up two green ticks for assertions never written. The hydra skip-discipline gate calls both V2 — "assert it or drop the test, do not stand down" — and it is right. This is the missing half: the work written down, so the exclusion points at something real. openspec/changes/ai-chat-companion-streaming/ proposal.md why, and what the empty bodies were meant to prove specs/ai-chat-companion/spec.md two requirements: incremental delivery (with a non-streaming fallback scenario, since a provider without generateStreamOfText must still answer), and a heartbeat so a slow call is distinguishable from a hung one tasks.md including 1.1/1.2, which say plainly that the assumed provider shape and the 15s/35s heartbeat pairing in the old test comments are GUESSES to be measured, not carried forward The skip stays, and task 4.3 says why: it may only be removed once 4.1 and 4.2 give those bodies real assertions. The reason is rewritten to describe the actual state. The old wording tripped the gate's DEPLOY_STATE phrase "not yet wired"; the new one is checked against that list and classifies as allowed — verified, because rewriting a reason without checking would have left it a V2. Verified: prettier clean; `playwright test --list` 272 tests across 55 files, unchanged. --------- Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Two defects, both measured against a booted demo rather than inferred from
the code.
The verification step told you to run
curl -s -o /dev/null -w '%{http_code}' http://localhost:PORT/apps/APP/
and described a pass. That request is unauthenticated, and a Nextcloud app
page requires a login, so it prints 401 on a perfectly healthy demo. A reader
following the page would conclude the demo was broken. The command now sends
the demo credentials and says in words that a bare 401 is expected.
Thematiq additionally has no app route at all — it declares
<admin-section>theming</admin-section> — so /apps/thematiq/ answers 404 even
authenticated. Its page now opens Settings -> Administration -> Theming.
Verified on two booted demos: the corrected commands return 200.
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
…ance (#520) The demo-data step shipped to this app with no Playwright coverage. Its unit tests mock the import service, so they validate the CALL and never its effect — and that is the gap this programme already fell through: the descriptor import printed `register "<app>" imported.` while seeding ZERO objects, and every unit test stayed green. So the assertion is not "the endpoint answers 200". It is that the response NAMES WHAT LANDED. A success message that cannot be told apart from an import that wrote nothing is what let that defect through. Three tests: setup/status REPORTS the demo-data step (a step it never mentions is unmet forever and parks the wizard over the app); installing reports a NON-ZERO object count through the real AuthorizedAdminSetting middleware; and re-installing succeeds, because the step body promises the operator it is "safe to run more than once". 🔴 PROVEN BEFORE BEING COPIED. This spec ran green on larpinq first — all three arms, against a live instance, in a dispatched run — because a PR into `development` deliberately SKIPS the E2E tier ("E2E on the promotions, not on every pull request"), so a green PR would not have exercised it at all. Replicating an unproven spec four times is how one formatting slip becomes four red pipelines. Deliberately not asserted: that setup.steps[0] IS the demo-data step. The app bundles its manifest rather than serving it, so that is not observable here; gate-100 checks it statically. Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 18:24 UTC
Download the full PDF report from the workflow artifacts.
…etion key (#523) development's E2E is failing 37 specs across agents, applications and automations. The app is healthy - bundle 200 at 14MB, registers and schemas seeded, api/applications 200. A dialog is covering the page and swallowing every click. My previous commit set setup_completed_version and did NOT fix it. That key is an OUTPUT of SetupController::status(), not an input: status() recomputes each step from its own evidence on every call, and only then writes the key. seed done <- seedService->countSeeded() > 0 (the occ seed above) store done <- appconfig registry_url is set demo-data done <- appconfig demo_data_decided is set Since nextcloud-vue 2.21, an OUTSTANDING OPTIONAL step is enough to open the wizard - nextcloud-vue#806 fixed CnAppRoot short-circuiting on "completed". So "store" and "demo-data" being undone put the dialog up even though "completed" is true, because the required "seed" step is done. demo_data_decided is the app's own "dealt with" flag rather than "objects exist" - its own comment says re-offering the import every visit would make "no thanks" impossible to express. Writing it is what an operator who declined leaves behind. Why this reads as flake rather than a modal: Playwright reports the target found, visible, enabled and stable, then retries the click ~55 times against .modal-container__content until timeout. The intercepting element appears only in the call log, never in the error message.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ❌ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ❌ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ⏭️ | ||||
| build | ❌ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ❌ | ||||
| format | ✅ | ||||
| check-schema-l10n | ❌ | ||||
| composer | ✅ | ❌ | |||
| npm | ⏭️ | ❌ | |||
| app:check-code | ⏭️ | ||||
| info.xml | ⏭️ | ||||
| REUSE | ⏭️ | ||||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-28 18:42 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-28 19:24 UTC
Download the full PDF report from the workflow artifacts.
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.13 to 3.4.14. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](cure53/DOMPurify@3.4.13...3.4.14) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [gridstack](https://github.com/gridstack/gridstack.js) from 12.6.0 to 13.2.0. - [Release notes](https://github.com/gridstack/gridstack.js/releases) - [Changelog](https://github.com/gridstack/gridstack.js/blob/master/doc/CHANGES.md) - [Commits](gridstack/gridstack.js@v12.6.0...v13.2.0) --- updated-dependencies: - dependency-name: gridstack dependency-version: 13.2.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ❌ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-29 13:20 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-29 14:33 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-29 16:49 UTC
Download the full PDF report from the workflow artifacts.
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-29 20:55 UTC
Download the full PDF report from the workflow artifacts.
Bumps [sass](https://github.com/sass/dart-sass) from 1.102.0 to 1.103.1. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](sass/dart-sass@1.102.0...1.103.1) --- updated-dependencies: - dependency-name: sass dependency-version: 1.103.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-30 00:11 UTC
Download the full PDF report from the workflow artifacts.
Bumps [@nextcloud/initial-state](https://github.com/nextcloud-libraries/nextcloud-initial-state) from 2.2.0 to 3.0.0. - [Release notes](https://github.com/nextcloud-libraries/nextcloud-initial-state/releases) - [Changelog](https://github.com/nextcloud-libraries/nextcloud-initial-state/blob/main/CHANGELOG.md) - [Commits](nextcloud-libraries/nextcloud-initial-state@v2.2.0...v3.0.0) --- updated-dependencies: - dependency-name: "@nextcloud/initial-state" dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#503) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.67.0 to 8.68.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.68.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-version: 8.68.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ❌ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ❌ | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-30 06:50 UTC
Download the full PDF report from the workflow artifacts.
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 7.4.1 to 7.5.0. - [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases) - [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/main/CHANGELOG.md) - [Commits](nextcloud-libraries/nextcloud-dialogs@v7.4.1...v7.5.0) --- updated-dependencies: - dependency-name: "@nextcloud/dialogs" dependency-version: 7.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.6 to 8.2.2. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 8.2.2 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-30 06:59 UTC
Download the full PDF report from the workflow artifacts.
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.29.7 to 8.0.1. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v8.0.1/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 8.0.1 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [stylelint-config-html](https://github.com/ota-meshi/stylelint-config-html) from 1.1.0 to 2.0.0. - [Release notes](https://github.com/ota-meshi/stylelint-config-html/releases) - [Changelog](https://github.com/ota-meshi/stylelint-config-html/blob/main/CHANGELOG.md) - [Commits](ota-meshi/stylelint-config-html@v1.1.0...v2.0.0) --- updated-dependencies: - dependency-name: stylelint-config-html dependency-version: 2.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan-phar-composer-source) from 2.2.8 to 2.2.9. - [Commits](https://github.com/phpstan/phpstan-phar-composer-source/commits) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-version: 2.2.9 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ruben van der Linde <rubenvdlinde@gmail.com>
beta held 20 commit(s) development did not. Merged with -s ours: development's tree is kept BYTE FOR BYTE and only the ancestry is recorded. That is the payload -- without it the merge base never moves and the next development -> beta promotion conflicts on the version file exactly as before. 13 of 19 promotion PRs were CONFLICTING for this reason. Nothing is silently imported. What beta holds and development does not, and which this deliberately does NOT bring over: .forgejo/.beta-release-trigger docs/.docusaurus/conduction-features-page/default/conduction-features-page.json docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-7fc.json docs/.docusaurus/docusaurus-plugin-content-docs/default/site-business-rules-engine-md-3d1.json docs/.docusaurus/docusaurus-plugin-content-docs/default/site-releasing-md-9c6.json docs/.docusaurus/docusaurus-plugin-content-docs/default/site-template-store-md-d43.json docs/.docusaurus/docusaurus-plugin-content-docs/default/site-tutorials-update-a-virtual-app-md-0ae.json docs/.docusaurus/docusaurus-plugin-content-docs/default/site-widgets-md-7ae.json docs/.docusaurus/docusaurus-plugin-debug/default/__plugin.json docs/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-c04.json docs/.docusaurus/docusaurus.config.mjs docs/.docusaurus/globalData.json docs/.docusaurus/registry.js docs/.docusaurus/routes.js docs/.docusaurus/routesChunkNames.json docs/.docusaurus/site-metadata.json docs/build/assets/css/styles.740d720e.css docs/build/assets/files/Application-cf715a9b980004dc0b93a577a85fccdf.php docs/build/assets/files/ApplicationsController-51b021c43dd63e080fc291e88e44514d.php docs/build/assets/files/BuilderHost-0cf79ddd7ecce1e2a83b0d2aa7f2207c.vue docs/build/assets/files/manifest-32f8077f823629419f0ce31db5ce1874.json docs/build/assets/files/openbuild_register-0de59e513f7bf6b9ae78655319cde6ff.json docs/build/assets/files/routes-950275b1c16bb42a14f1872214ab6d62.php docs/build/assets/images/01-first-launch-01-8521c3f2a35281d5ff9618e259d7ed9f.png docs/build/assets/images/01-first-launch-02-8521c3f2a35281d5ff9618e259d7ed9f.png docs/build/assets/images/01-first-launch-03-8521c3f2a35281d5ff9618e259d7ed9f.png docs/build/assets/images/01-first-launch-04-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/01-rbac-01-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/01-rbac-02-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/01-rbac-03-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/01-rbac-04-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/01-rbac-05-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/02-create-from-template-01-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/02-create-from-template-02-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/02-create-from-template-03-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/02-create-from-template-04-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/02-create-from-template-05-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/02-template-catalogue-01-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/02-template-catalogue-02-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/02-template-catalogue-03-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/02-template-catalogue-04-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/02-template-catalogue-05-23b84a32a533f7862e063cfba86b991f.png docs/build/assets/images/03-admin-settings-01-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/03-admin-settings-02-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/03-admin-settings-03-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/03-admin-settings-04-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/03-admin-settings-05-94f692a82b7cd86622fcae1e36e23b2c.png docs/build/assets/images/03-design-schema-01-fb6a5ea42fdc3279ceab376350e027d2.png docs/build/assets/images/03-design-schema-02-dde299a0a6a3ee2b9e7605f09485f4a1.png docs/build/assets/images/03-design-schema-03-dde299a0a6a3ee2b9e7605f09485f4a1.png docs/build/assets/images/03-design-schema-04-dde299a0a6a3ee2b9e7605f09485f4a1.png docs/build/assets/images/03-design-schema-05-dde299a0a6a3ee2b9e7605f09485f4a1.png docs/build/assets/images/04-design-page-01-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/04-design-page-02-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/04-design-page-03-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/04-design-page-04-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/04-design-page-05-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/05-connect-data-01-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/05-connect-data-02-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/05-connect-data-03-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/05-connect-data-04-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/05-connect-data-05-877c7410f2000413d493e1f544da743d.png docs/build/assets/images/06-preview-app-01-ee3645075c087f0814d101767c138ecf.png docs/build/assets/images/06-preview-app-02-ee3645075c087f0814d101767c138ecf.png docs/build/assets/images/06-preview-app-03-ee3645075c087f0814d101767c138ecf.png docs/build/assets/images/06-preview-app-04-ee3645075c087f0814d101767c138ecf.png docs/build/assets/images/06-preview-app-05-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/07-version-snapshots-01-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/07-version-snapshots-02-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/07-version-snapshots-03-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/07-version-snapshots-04-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/07-version-snapshots-05-83a61c5b893e3cd20af3373f969ad3c3.png docs/build/assets/images/08-export-app-01-e1db690270c7f7278c9510d8b6c0ce58.png docs/build/assets/images/08-export-app-02-c07c71a695c73401a291806af7ffff79.png docs/build/assets/images/08-export-app-03-474c6b0ee1b845636f7a0c629154fa7a.png docs/build/assets/images/08-export-app-04-474c6b0ee1b845636f7a0c629154fa7a.png docs/build/assets/images/08-export-app-05-474c6b0ee1b845636f7a0c629154fa7a.png docs/build/assets/js/08d1b72e.40c24ede.js docs/build/assets/js/11b43341.71f34228.js docs/build/assets/js/36f4eb15.8607a88e.js docs/build/assets/js/536bad4a.53167de3.js docs/build/assets/js/55d11d86.4225334b.js docs/build/assets/js/6ebc08aa.5c526b58.js docs/build/assets/js/724a0b1a.cb4a7ea2.js docs/build/assets/js/7ca9b633.57f8879e.js docs/build/assets/js/8007.42191389.js docs/build/assets/js/8aec9aab.404a1a47.js docs/build/assets/js/9c60e451.387e169f.js docs/build/assets/js/afa3ca50.19dcf88d.js docs/build/assets/js/cb02ec7f.456697d8.js docs/build/assets/js/d3963936.5d0c9159.js docs/build/assets/js/d43a21c9.a2c208af.js docs/build/assets/js/eb3d7fb5.fdc4a49b.js docs/build/assets/js/ec6d3eb8.aad75a70.js docs/build/assets/js/ee40a5e8.b76c00a0.js docs/build/assets/js/fe9572d3.0366c519.js docs/build/assets/js/main.9ed3e618.js docs/build/assets/js/main.9ed3e618.js.LICENSE.txt docs/build/assets/js/runtime~main.7da6317d.js docs/build/docs/template-store/index.html docs/static/screenshots/widgets/01-add-widget.png docs/static/screenshots/widgets/02-object-relations-config.png docs/static/screenshots/widgets/chart-widget.png docs/static/screenshots/widgets/dashboard-all-widgets.png docs/static/screenshots/widgets/delta-widget.png docs/static/screenshots/widgets/detail-all-widgets.png docs/static/screenshots/widgets/gauge-widget.png docs/static/screenshots/widgets/header-widget.png docs/static/screenshots/widgets/image-widget.png docs/static/screenshots/widgets/object-data-widget.png docs/static/screenshots/widgets/object-list-widget.png docs/static/screenshots/widgets/object-widgets-on-page.png docs/static/screenshots/widgets/stat-widget.png docs/static/screenshots/widgets/text-widget.png docs/widgets.md Those are dead Forgejo/Codeberg CI (removed from development on 2026-08-24/25 by 'chore(ci): remove dead Forgejo/Codeberg CI configuration'), generated Docusaurus build output, and community-health files that never existed on development. Each can be added deliberately if wanted; resurrecting them as a side effect of a sync is how a merge silently undoes a decision.
…260830084354 chore(sync): carry beta back into development
…0841 chore(sync): record beta's ancestry on development
…constraints (#554) PRs #506 (@babel/core 8.0.1) and #504 (stylelint-config-html 2.0.0) were merged into development, but neither major is installable against the app's current upstream pins. `npm ci` on development now fails with ERESOLVE, which breaks every frontend job. - @nextcloud/webpack-vue-config@7.0.4 (latest) declares peer @babel/core "^7.22.9" — no published 7.x accepts Babel 8. - stylelint-config-html@2.0.0 requires peer postcss-html "^2.0.0", but @nextcloud/stylelint-config@3.2.2 (latest) pins stylelint-config-recommended-vue "^1.6.1", which pins postcss-html "^1.0.0". Reverts both constraints to the last installable values. Verified with npm ci, stylelint, eslint, webpack production build and vitest.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 640/640 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-30 08:54 UTC
Download the full PDF report from the workflow artifacts.
The dependabot sweep on 2026-08-30 merged several bumps whose lockfiles were each generated in isolation. Git merged the lock text cleanly, but the result no longer matched package.json: npm ci refused with "Missing: pinia@4.0.3 from lock file". No constraint is changed here. The lock is regenerated from the package.json already on development, which is what brings the two back into agreement. Verified with npm ci --dry-run: exit 0. Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ⏭️ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ⏭️ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ⏭️ | ||||
| eslint | ⏭️ | ||||
| stylelint | ⏭️ | ||||
| build | ⏭️ | ||||
| composer | ⏭️ | ⏭️ | |||
| npm | ⏭️ | ⏭️ | |||
| app:check-code | ⏭️ | ||||
| info.xml | ⏭️ | ||||
| REUSE | ⏭️ | ||||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-30 09:20 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/buildiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| check-gitignore | ✅ | ||||
| check-nc-floor | ✅ | ||||
| format | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 642/642 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-30 10:37 UTC
Download the full PDF report from the workflow artifacts.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.