Skip to content

feat(setup): a wizard that offers the demo data this app already ships - #785

Merged
rubenvdlinde merged 3 commits into
developmentfrom
feat/setup-wizard-offers-demo-data
Aug 29, 2026
Merged

feat(setup): a wizard that offers the demo data this app already ships#785
rubenvdlinde merged 3 commits into
developmentfrom
feat/setup-wizard-offers-demo-data

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

This app ships lib/Settings/*_mock_register.json — a dataset generated from its own schemas,
conformant by construction and validated by the generator's --check — and had no way for an
operator to reach it
. There was no setup wizard at all.

welcome → demo-data → done

Nothing app-specific is invented. The only action is the demo-data import the descriptor already
supports. A wizard that asked questions the app does not act on would be worse than none, which is
why there are no configuration steps here yet — those belong to whoever owns each app's config
surface.

The step records its outcome either way

completed is true and the demo-data step is optional, so setup never gates the app.

skip-demo-data writes demo_data_decided just as installing does. Since
@conduction/nextcloud-vue 2.21 an outstanding optional step opens the wizard over every page
(nextcloud-vue#806), so a step that can never be marked done is a dialog that never closes — the
defect buildiq was failing 37 E2E specs on before buildiq#523.

Verified

  • manifest validates against schema 2.26.0; gate-100 PASS with welcome, demo-data, done
  • routes.php and both PHP files parse
  • the template was checked on launchpad against phpcs, phpstan, psalm and phpmd — all clean

Two things caught while rolling this out, both fixed before pushing:

  • the routes insert first anchored on tab indentation and silently matched nothing in the seven
    apps that indent with spaces, briefly leaving a wizard whose endpoints did not exist
  • gate-100 reported PASS vacuously for those same apps, because it exits 0 when there is no
    setup block at all — the check only became meaningful once the block existed

Conduction Release Bot added 2 commits August 28, 2026 21:43
This app ships lib/Settings/*_mock_register.json - a dataset generated from its
own schemas, conformant by construction, validated by the generator's --check -
and had no way for an operator to reach it. There was no setup wizard at all.

welcome -> demo-data -> done. Nothing app-specific is invented: the only action
is the demo-data import the descriptor already supports. A wizard that asked
questions the app does not act on would be worse than none, which is why there
are no configuration steps here yet.

completed is TRUE and the demo-data step is optional, so setup never gates the
app. skip-demo-data records its outcome just as installing does: since
nextcloud-vue 2.21 an OUTSTANDING OPTIONAL step opens the wizard over every
page (nextcloud-vue#806), so a step that can never be marked done is a dialog
that never closes - the defect buildiq was failing 37 E2E specs on.

Verified: manifest validates against schema 2.26.0, gate-100 PASS, routes.php
and both PHP files parse. The template was checked on launchpad against phpcs,
phpstan, psalm and phpmd - all clean.
…trings

Two gate findings on the previous push.

gate-5 route-auth — status() and runAction() carried no auth attribute. The
docblock said 'admin-only by Nextcloud's default for an un-attributed method',
which is true and is not a declaration: the gate exists because a missing
attribute silently makes an endpoint unreachable, and a comment cannot be
checked by middleware. Both now carry
#[AuthorizedAdminSetting(Application::APP_ID)], placed DIRECTLY above the
declaration - gate-5 walks upward from the method and a long docblock between
attribute and declaration costs the attribute its visibility, which the gate
documents as a false FAIL it had to repair.

gate-102 manifest-l10n-coverage — the wizard's title and body strings had no
l10n/nl.json key, so a Dutch user would read them in English. Added, and the
browser catalogue rebuilt where the app ships one: nl.json alone is not enough,
because the browser reads nl.js.

The catalogue edit is insertions only, proven against the same change applied
structurally - an earlier attempt on another app re-serialised the whole file
(410 lines) before being reverted.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/stackiq @ 952572b

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
format
check-schema-l10n
check-l10n-js
composer ✅ 130/130
npm ✅ 721/721
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman ⏭️
Playwright 🚨 NO VERDICT — enabled but never ran
Hydra gates

Quality workflow — 2026-08-28 20:05 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/stackiq @ d1f5c05

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
format
check-schema-l10n
check-l10n-js
composer ✅ 130/130
npm ✅ 721/721
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman ⏭️
Playwright 🚨 NO VERDICT — enabled but never ran
Hydra gates

Quality workflow — 2026-08-28 20:19 UTC

Download the full PDF report from the workflow artifacts.

… it guards

`AuthorizedAdminSetting` takes a `class-string<IDelegatedSettings>`, not an
app id, so `Application::APP_ID` — a plain string — was rejected by phpstan.
The apps where this shipped green (larpinq, shillinq) already pass their admin
settings class; match them.

gate-47 and the coverage ratchet were both right to fail this. The change adds
an admin-authorized endpoint pair and ~364 lines of PHP with nothing behind
them. Two assertions are worth naming:

- a FAILED install must leave the step UNDECIDED. Recording the decision in
  the catch block would close the step for an operator who asked for demo data
  and received none.
- the object count comes from the FILE, not the importer's reply, so the
  number reported is the number ASKED FOR.

Both verified by mutation on openregister: reversing each behaviour fails
exactly the test that claims to guard it. The e2e spec issues both calls from
inside the logged-in admin page, which is the only place that middleware can
be observed admitting a real session.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/stackiq @ dbbe816

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
format
check-schema-l10n
check-l10n-js
composer ✅ 130/130
npm ✅ 721/721
app:check-code ⏭️
info.xml
REUSE
PHPUnit
Newman ⏭️
Playwright 🚨 NO VERDICT — enabled but never ran
Hydra gates

Quality workflow — 2026-08-29 01:41 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 80f8c74 into development Aug 29, 2026
45 checks passed
@rubenvdlinde
rubenvdlinde deleted the feat/setup-wizard-offers-demo-data branch August 29, 2026 01:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant