Repository navigation
Release: merge development into beta - #1026
Conversation
…260912202721 chore(release): 0.2.3-unstable.20260912202721
…0260913184544 chore(sync): carry beta back into development
…istry (#1032) * feat(connections): declare email, federation and the end-of-life feed for integriq * feat(connections): refresh and report email, federation and the end-of-life feed to integriq * feat(connections): an Integrations page over integriq's connection registry * test(connections): an e2e spec for the Integrations page, with integriq in CI * test(connections): named arguments, and stubs that wait for OCP * refactor(connections): keep the event senders private
… bytes (#1049) Prettier 3.9.6 over the four files the connection-registry wave merged unformatted, so `npm run format` passes again. ConnectionsDeclarationTest now reads appinfo/info.xml as bytes: Nextcloud's lib/base.php installs an external entity loader that returns null, so simplexml_load_file() returns false in every CI cell. Verified locally: npm run format exit 0, npm run lint 0 errors, composer check:strict ALL CHECKS PASSED, phpunit --filter ConnectionsDeclarationTest green.
…roller (#1051) The test builds SettingsController with newInstanceWithoutConstructor(), so the promoted ?ConnectionReportService $connectionReports = null never received its null and PHP threw on the read in all six cells. Verified with the standalone unit config: 11 tests pass, and the unchanged file reproduces CI's exact error.
…gain (#1054) The module schema's licence property carried a stray "licence": "License" beside its real title. openregister's vocabulary check rejected the whole schema at import while answering 200, so CI seeding failed. openregister's own validator now reports 20 schemas, 0 rejected, for both register files (it reproduced the CI rejection before the fix). Gates pass.
… formatters come from nextcloud-vue 3.2.0 (#1053) * feat(connections): switched-off federation and a switched-off EOL sync read disabled through their switches federation declares switch on federation_enabled, and eol-feed on enabled inside eol_sync_config (hydra connection-registry D4 rule 2b, D12 items 6, 7 and 9). A peer change, a pull, a sync save and a sync run no longer report unconfigured when the feature is off: the save still refreshes, and integriq resolves disabled itself. * test(connections): a switched-off federation with no peers reports nothing The earlier case had a peer, so dropping the switch guard left the outcome the same and the test green. With no peers the guard is the only thing between the switch and a no-peer-catalog report. * chore(deps): @conduction/nextcloud-vue 2.39.0 -> 3.2.0, and the connection formatters come from the library 3.2.0 ships connectionStatus, with disabled read as Switched off, and connectionSettingsLabel as built-ins (nextcloud-vue#1173, #1175). The local copy in src/services/connectionRegistry.js and App.vue's formatters prop are gone; the handler stays. The spec now checks the manifest's formatter names against the installed library's built-in map. The range was ^2.37.0 with 2.39.0 locked; against development only the library and the hoisted @nextcloud/files (3.12.2 -> 4.0.0) move at the top level. * test(connections): declare the built-in formatter reader with the function keyword antfu/top-level-function refuses a top-level arrow function. * test(connections): import the built-in formatters and call them, instead of reading the module source
…name (#1056) A row's accessible name starts with its Select row checkbox, so the anchored pattern matched 0 rows (keepiq#717). Rows are now matched through their Connection cell.
Bumps [eslint](https://github.com/eslint/eslint) from 10.9.1 to 10.10.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](eslint/eslint@v10.9.1...v10.10.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 10.10.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>
Bumps [zod](https://github.com/colinhacks/zod) from 4.5.4 to 4.6.5. - [Release notes](https://github.com/colinhacks/zod/releases) - [Commits](colinhacks/zod@v4.5.4...v4.6.5) --- updated-dependencies: - dependency-name: zod dependency-version: 4.6.4 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 [gridstack](https://github.com/gridstack/gridstack.js) from 13.2.0 to 13.3.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@v13.2.0...v13.3.0) --- updated-dependencies: - dependency-name: gridstack dependency-version: 13.3.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 [dexie](https://github.com/dexie/Dexie.js) from 4.4.5 to 4.4.6. - [Release notes](https://github.com/dexie/Dexie.js/releases) - [Commits](dexie/Dexie.js@v4.4.5...v4.4.6) --- updated-dependencies: - dependency-name: dexie dependency-version: 4.4.6 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>
…stered (#1059) settings#getArchiMateConfig is declared at /api/archimate/config and at /api/archimate/status with no postfix on either. A route name carries neither URL nor verb, so the two register as one and the later declaration wins: GET /api/archimate/config is a 404. Which of the two survives depends on line order alone, and the survivor is the one the settings store polls, inside a catch with an empty body. postfix on the second entry gives each its own name. Measured with Nextcloud's own RouteParser: declared=132 registered=131 before, 132 after. No URL or verb changes. RouteNameUniquenessTest asserts on each entry's registration key and is mutation-checked against the old routes file.
The 3.x line was withdrawn on 2026-09-19. npm dist-tags now give latest = 2.55.1, the 2.x releases were published after the 3.x ones that day, and only the v2 tags survive. A range of ^3.2.0 matches only 3.x, so this app could never resolve the next release. 2.55.1 is a strict superset of 3.4.0: every one of the 621 CJS and 536 ESM export names is present, no published file is missing, and package.json is identical apart from the version. Verified by unpacking both tarballs.
…o-2x chore(deps): move nextcloud-vue back to the 2.x line
173 rows in 12 areas against five competitor columns, competitor cells from the intelligence database. Stackiq's own column is not read yet.
134 rated rows and 39 pending across 12 areas. Every own rating carries a path and a line, a reachedOn and, on sibling rows, the owning repo.
feat(parity): stackiq's capability matrix against five competitors
Later parity lanes read other products and found ratings and wording in this matrix that their code contradicts. Corrected rows carry readOn 2026-09-26 and name the cross-product evidence.
…ections-2026-09-26 fix(parity): apply cross-lane corrections to the capability matrix
…ic docs read 2026-09-26) and r-glpi packs to 29
…, sources objects for three systems
…admaps and changelogs, stackiq rated from code
…k-name fix(ci): name the branch-protection job so the required check matches
* feat(setup): each example data card loads itself
The demo-data cards step declares loadAction: load-demo-data and the
separate run-action load step is gone. The load action accepts
{ dataset } in the body, refuses an unknown dataset, and records the
pick only after a successful load; a call without a body still loads
the stored pick. Setup status reports every manifest step id.
OpenSpec change: wizard-dataset-card-load.
* chore(deps): raise @conduction/nextcloud-vue to ^2.65.0 for loadAction
* style(e2e): prettier on the demo data setup step spec
The generic Reports entry leaves the footer for the settings foldout, which nextcloud-vue now labels Advanced.
…ec that delivered them
…links docs(openspec): specs for unbuilt capabilities, capability-to-spec links
docs(openspec): competitor cells on spec-round rows read unknown
Two after-the-fact main specs describe what the code does today: first-time-setup (land-demo-data) and application-hosting-model (land-hosting-model). The Reports page card joins the portfolio-rationalization-time spec (ins-reports-page), whose placeholder Purpose is replaced. The other seven spec:none rows are provided by Nextcloud, nextcloud-vue or OpenRegister and stay none.
ins-natural-language-query and ins-ai-action-audit pointed at MCP changes that specify only the tools. The new change insight-assistant-answers-and-action-trail specifies the Ask panel (answers grounded in a catalogue search, with linked sources) and the Assistant actions page over OpenRegister's mcp.* audit records.
…from code Decision 79. Each row was re-read against development on 7 Oct: state, stackiq rating and evidence come from the code, the competitor cells stay as rated on 26 Sep, and built.change names the change that delivered or specifies the row. pendingQuestion becomes the schema's question field. pending[] stays as an empty list.
…usion The demo-data e2e test carries no scenario marker, so gate 19 cannot match a plain @e2e reference to it. Adding the marker is a test edit, which this round does not make.
docs(openspec): re-rated rows and specs for unspecified built capabilities
docs(openspec): specs for the missing parts of half-built capabilities
…three left open Archived: adopt-live-updates-ui (skip-specs, realtime-updates-ui holds it word for word), portal-contribution, publication-field-rules (new spec), the-catalogue-contract-is-a-facet and namespace-the-catalogue-service (MODIFIED on a spec that never existed, relabelled ADDED; new spec software-catalog), wizard-dataset-card-load. Real Purpose written for both new specs. Left open with a note: sharing-itsm-exchange (live checks), beta-surface-alignment and rename-app-id-to-stackiq (no delta headers, prose needs fixing first).
docs(openspec): archive pass, changes the code has delivered
beta-surface-alignment: ADDED Requirements, licence scenario names GitHub (the only host), GOVERNMENT-FEATURES T-02 row corrected; archived into a new beta-alignment spec. rename-app-id-to-stackiq: ADDED Requirements, old id softwarecatalog restored in the prose, OpenRegister appId and docs-host scenarios match the code. Left open: the dashboard widget id was renamed despite being specified as frozen.
docs(openspec): fix deltas so built changes can archive
…p the widget #708's rename sweep changed ConceptOrganisatiesWidget::getId() from softwarecatalog_concept_organisaties_widget to stackiq_concept_organisaties_widget under a comment saying the id is frozen. The Dashboard app stores each user's layout by widget id, so the widget dropped off every dashboard that had it. Restore the old id in getId() and in the OCA.Dashboard.register() call, and pin both with a unit test. Tick the last task of rename-app-id-to-stackiq and archive it, creating the app-id-rename main spec.
fix(dashboard): restore the frozen widget id so users' dashboards keep the widget
| // simply stops matching the stored selection and silently vanishes from | ||
| // every dashboard that had it. | ||
| return 'stackiq_concept_organisaties_widget'; | ||
| return 'softwarecatalog_concept_organisaties_widget'; |
There was a problem hiding this comment.
🟡 Concern — Restoring the old id drops the widget for everyone on stackiq 0.1.148 to 0.2.x
Stable releases v0.1.148, v0.1.149, v0.1.150 and v0.2.0 (since 2026-08-30) all ship stackiq_concept_organisaties_widget, and so does beta. Anyone who added the widget on one of those now loses it, which is the same silent drop this commit fixes for the pre-rename users. The comment says repair steps cannot reach the Dashboard app's rows, but lib/Repair/MigrateUserPreferences.php already writes oc_preferences. A repair step that replaces stackiq_concept_organisaties_widget with this id in the dashboard/layout preference keeps both groups of users, and the comment here should then say so.
There was a problem hiding this comment.
Addressed in #1271: a post-migration repair step RepointDashboardWidgetId rewrites stackiq_concept_organisaties_widget to the frozen id in every seen user's dashboard/layout preference, in place and without listing the frozen id twice; layouts without the renamed id are not written. The widget comment and the app-id-rename spec no longer say the rows are out of reach (the spec gets a scenario for this second group of users). Upgrade-only, so not in <install>.
| * @return JSONResponse The status document. | ||
| * | ||
| * @spec exclude Setup status document; ADR-042 contract, no per-app behavioural spec. | ||
| * @spec openspec/changes/wizard-dataset-card-load/specs/first-time-setup/spec.md |
There was a problem hiding this comment.
🟡 Concern — The archive pass left 47 @spec tags pointing at moved files
openspec/changes/wizard-dataset-card-load/ never existed outside archive/ (it was added straight into archive/2026-10-07-wizard-dataset-card-load/), so these four tags never resolved. The same pass (1aa2346, 7339b35) moved three more changes without updating their tags: portal-contribution (8 tags, 2 files), publication-field-rules (21 tags, 8 files) and rename-app-id-to-stackiq (14 tags, 3 files). The specs now live in openspec/specs/{first-time-setup,portal-contribution,publication-field-rules,app-id-rename}/spec.md, so a sed from openspec/changes/<name>/specs/<cap>/spec.md to openspec/specs/<cap>/spec.md fixes all of them; the anchors (for example #requirement-externally-owned-identifiers-stay-frozen) should be checked against the synced spec while doing that.
Verification: git grep -h -o "@spec openspec/[^ ]*" <ref> -- lib src tests | sed 's/#.*//' | sort -u and checking each path at 58dbd192 against eb2abdb9: these four paths are the only new misses.
There was a problem hiding this comment.
Fixed in #1271: the 47 tags of the four changes you named (wizard-dataset-card-load 4, portal-contribution 8, publication-field-rules 20, rename-app-id-to-stackiq 14; 16 files) now point at openspec/specs/<capability>/spec.md. Every target exists and the REQ-PFR-002/REQ-PFR-003 and app-id-rename anchors match the synced headings. The older stale tags from before 58dbd192 are left as they were.
SudoThijn
left a comment
There was a problem hiding this comment.
Re-review at eb2abdb9
Re-checked the 24 commits since the approval at 58dbd192 (#1239 branch-protection job name, #1241 dataset cards load themselves, #1242 Reports under Advanced, #1261 frozen widget id, and the OpenSpec passes #1245 to #1254). CI is green, including both required checks, and no review threads are open.
| Area | Checked | Result |
|---|---|---|
SetupController card load |
The posted dataset goes through the same refuseDataset() as the config write; the pick is stored only after a successful load; status() reports every manifest step id, pinned by a test that reads the manifest. |
Sound |
loadAction in the manifest |
@conduction/nextcloud-vue 2.65.0 (lockfile) has CnSetupWizard::loadDataset(), which posts { dataset } to /api/setup/action/{loadAction}. |
Matches |
| Widget id | PHP getId() and OCA.Dashboard.register() agree and are pinned by a test. |
See inline |
@spec tags |
47 tags now point at archived paths. | See inline |
Two 🟡 points in the inline comments, neither blocking this promotion.
Review assisted with Claude AI.
…x 47 @SPEC paths Two findings from Thijn's re-review of the beta promotion (#1026), after #1261 restored the frozen widget id: Restoring `softwarecatalog_concept_organisaties_widget` keeps the widget for users from before the rename, but drops it for everyone who added it while stable 0.1.148 to 0.2.0 and beta registered it as `stackiq_concept_organisaties_widget`. The Dashboard app keeps that choice in `oc_preferences` under its own app id `dashboard`, key `layout`, as a comma-separated list of widget ids, which IConfig reaches like this app's own rows. The new post-migration repair step RepointDashboardWidgetId rewrites the renamed id to the frozen one for every seen user, in place and without listing the frozen id twice; a layout without the renamed id is left alone. The widget comment and the app-id-rename spec no longer claim the rows are out of reach. The archive pass (1aa2346, 7339b35) moved four changes without updating their @SPEC tags: wizard-dataset-card-load (4), portal-contribution (8), publication-field-rules (20) and rename-app-id-to-stackiq (14), 47 tags in 16 files now point at openspec/specs/<capability>/spec.md. The anchors were checked against the synced specs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.