Skip to content

Release: merge development into beta - #1026

Merged
WilcoLouwerse merged 230 commits into
betafrom
development
Oct 8, 2026
Merged

WilcoLouwerse merged 230 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.

github-actions Bot and others added 30 commits September 12, 2026 20:29
…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
…admaps and changelogs, stackiq rated from code
…k-name

fix(ci): name the branch-protection job so the required check matches
rubenvdlinde and others added 22 commits October 7, 2026 09:35
* 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.
…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';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 SudoThijn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@WilcoLouwerse
WilcoLouwerse merged commit 612cad4 into beta Oct 8, 2026
64 checks passed
WilcoLouwerse added a commit that referenced this pull request Oct 8, 2026
…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>
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.

4 participants