docs(spec): public boot mode, public widget flag, and the journey runtime - #665
Merged
Merged
Conversation
…time Three spec-only changes for Portaliq phase two (hydra ADR-084/085). No code. public-manifest-runtime — bootstrapCnApp gains host: 'nextcloud' | 'public'. Exactly four things differ between the two: the mount element, URL resolution (generateUrl vs a configured base), transport auth (requesttoken vs bearer) and the router base. All four live in boot and cnFetch; NO Cn* component takes a host prop, because a component that needs to know is a component carrying a Nextcloud dependency it should not have. The integration test boots with OC, OCA, OCP and the requesttoken element DELETED, and is first run against host: 'nextcloud' in that same environment to observe it fail. Without that control, a green public-mode test proves only that the environment supplied the globals anyway. widget-registry-public-flag — every dashboardWidgetRegistry entry gains `public: boolean`, defaulting to FALSE. The registry is the fleet's single widget catalog (40 types, shared with LaunchPad and OpenBuild) and is about to gain a third consumer at a PUBLIC origin. Registering a widget must not, by that act alone, make an authenticated capability anonymously mountable. The proposal now carries a finding from Portaliq's interim implementation of this same rule: it kept an allow-list Set AND a hard-coded `widgetKey === 'markdown'` render check, so the allow-list decided nothing — the mutation test that added `files` to it PASSED. A gate that read as real in review was decorative. The fix was structural, not a stronger test: the allow-list became a key→component map so the decision and the rendering are one thing. The registry filter here must be built the same way; a `public` flag consulted beside an independent render condition is the same defect with a different spelling. journey-runtime — CnJourney and CnJourneyDialog, the ONE renderer for an OpenRegister journey, in-page and in a modal. Composes CnFormPage per form step rather than re-implementing field rendering; takes its step model from tilburg's con-stepper, which had it right (two levels, conditional steps, non-navigable groups); evaluates branches through the existing visibleWhen predicate and contains no second condition evaluator. Also absorbs the Den Haag process-steps indicator as a library component emitting NL Design markup — @utrecht ships 95 CSS packages to 17 React ones, so pulling a React library into a Vue portal for one component is the wrong trade.
Contributor
Quality Report — ConductionNL/nextcloud-vue @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ⏭️ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ⏭️ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ⏭️ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| test | ✅ | ||||
| check-build | ✅ | ||||
| check-docs | ✅ | ||||
| check-jsdoc | ✅ | ||||
| check-integration-parity | ✅ | ||||
| check-peers | ✅ | ||||
| check-docs-fresh | ✅ | ||||
| check-a11y | ✅ | ||||
| check-smoke | ✅ | ||||
| composer | ✅ | ✅ | |||
| npm | ✅ | ✅ 531/531 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ⏭️ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ | ||||
| Hydra gates | ⏭️ |
Quality workflow — 2026-08-15 07:59 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Three spec-only changes for Portaliq phase two. No code in this PR.
Programme context: hydra#581 (ADR-084/085). First implementation slice: portaliq#114.
public-manifest-runtimebootstrapCnApp()gainshost: 'nextcloud' | 'public', so a manifest-v2 app can boot at a public origin.Exactly four things differ between the two hosts — the mount element, URL resolution (
generateUrlvs a configured base), transport auth (requesttokenvs bearer), and the router base. All four live in boot andcnFetch. NoCn*component takes ahostprop: a component that needs to know is a component carrying a Nextcloud dependency it should not have, and the fix belongs in the component, not in a branch at the call site.The integration test boots with
OC,OCA,OCPand therequesttokenelement deleted, and is first run againsthost: 'nextcloud'in that same environment to observe it fail. Without that control, a green public-mode test proves only that the environment supplied the globals anyway.widget-registry-public-flagEvery
dashboardWidgetRegistryentry gainspublic: boolean, defaulting tofalse, plus a markdown widget.The registry is the fleet's single widget catalog — 40 registered types, consumed by OpenBuild and LaunchPad — and is about to gain a third consumer at a public origin. Registering a widget must not, by that act alone, make an authenticated capability anonymously mountable.
A finding carried from Portaliq's interim implementation
Portaliq implemented this same rule locally first, and got it wrong in a way worth recording. It kept an allow-list
Setand a hard-codedwidgetKey === 'markdown'render check — so the allow-list decided nothing. The mutation test that addedfilesto it passed. A gate that read as real in review, and in the code, was decorative.The fix was structural, not a stronger test: the allow-list became a
key → componentmap, so the decision and the rendering are one thing and a mutation of it is observable.The registry filter here must be built the same way. A
publicflag consulted beside an independent render condition is the same defect with a different spelling.journey-runtimeCnJourney(in-page) andCnJourneyDialog(modal) — the one renderer for an OpenRegisterjourney.CnFormPageper form step rather than re-implementing field rendering, validation or conditional visibility.con-stepper, which had it right: two levels, conditional steps, non-navigable groups.visibleWhenpredicate and contains no second condition evaluator.Also absorbs the Den Haag process-steps indicator as a library component emitting NL Design markup.
@utrechtships 95-csspackages to 17-reactones, so pulling a React library into a Vue portal for one component is the wrong trade (ADR-072).🤖 Generated with Claude Code