Skip to content

Release: merge development into beta - #477

Merged
rubenvdlinde merged 44 commits into
betafrom
development
Aug 30, 2026
Merged

Release: merge development into beta#477
rubenvdlinde merged 44 commits into
betafrom
development

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

rubenvdlinde and others added 4 commits August 27, 2026 12:31
#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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 0fe0195

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.

rubenvdlinde and others added 2 commits August 27, 2026 20:21
* 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.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 6dd9667

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.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ af74cab

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.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 0c3788c

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 963db4d

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 548811f

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.

Conduction Release Bot and others added 4 commits August 28, 2026 14:30
… 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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 5e54334

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ ffa3e30

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.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ f13e9dc

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.

rubenvdlinde and others added 3 commits August 28, 2026 20:09
… 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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 2bf3dd8

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.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ abf2a40

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.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 9ddc182

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.

dependabot Bot added 2 commits August 29, 2026 15:07
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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ d2187fa

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.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 2b19b2d

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.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 6e3b7a1

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ bb1cb90

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 51e306d

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.

dependabot Bot added 2 commits August 30, 2026 08:49
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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ cd0c0f5

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.

dependabot Bot added 2 commits August 30, 2026 08:57
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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ ae9d7af

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.

github-actions Bot and others added 9 commits August 30, 2026 09:59
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.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 1a7ea8b

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>
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ c70d214

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.

@rubenvdlinde
rubenvdlinde merged commit fff33b7 into beta Aug 30, 2026
90 of 91 checks passed
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/buildiq @ 5905eb6

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.

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.

2 participants