Skip to content

Release: merge development into beta - #1304

Open
github-actions[bot] wants to merge 384 commits into
betafrom
development
Open

github-actions[bot] wants to merge 384 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.

Comment thread tests/e2e/meeting-agenda-tools.spec.ts Fixed
Comment thread tests/e2e/voting-chair-close-and-amendment-rounds.spec.ts Fixed
Comment thread tests/e2e/voting-chair-close-and-amendment-rounds.spec.ts Fixed
Comment thread tests/e2e/voting-chair-close-and-amendment-rounds.spec.ts Fixed
Comment thread tests/e2e/agenda-change-notices.spec.ts Fixed
Comment thread tests/e2e/agenda-change-notices.spec.ts Fixed
rubenvdlinde and others added 20 commits September 29, 2026 20:55
…d-search

fix(publication): a confidential agenda item stays off the public site, and the published agenda carries its items and papers
…port

feat(export): administrators export all data with the meeting files in one archive
…ever published (#1544)

* wip: mid-task state when the lane was killed by the session limit (29 Sep 21:00); not verified

* fix(publication): a decision under a confidentiality restriction is never published

Both paths (catalogue publication and the decision's own publish action)
read confidentiality-restriction objects in system context and refuse an
imposed or ratified one; restrictions that cannot be read fail closed
with 503. Verifies the wip commit b84571c: DecisionConfidentialityTest
6 of 8 red on development 7dead20, 8 of 8 green now.

* test(decision): the publish success case reads no restrictions for its decision
…their attachments (#1546)

* feat(export): export motions and decisions with their attachments as a ZIP or one PDF (backend)

* feat(export): Export with attachments on the Motions and Decisions lists

* chore(openspec): archive motions-export-with-attachments; mot-16 and pub-17 built

* fix(export): gate findings (named arguments, the writer split out of the service, notifier dispatch, psalm stub for IRootFolder)

* fix(export): hydra gate findings (guarded file store lookup, @SPEC on the dialog, contract tests for both endpoints)

* fix(export): establish OpenRegister is installed before reading attachments (ADR-083)
… the CI coverage leg stops failing them as risky (#1547)
… publish public meetings to a residents' calendar (#1550)

* wip(calendar): activity publication source type and public calendar collection, not verified by the gate

* wip(calendar): calendar filters, publish action, seed, docs, archive and pla-16 built, not verified by the gate

* fix(calendar): gate findings, schema titles, spec tags, public calendar in its own method
…ord them per file on meetings and agenda items (#1553)

* wip(documents): document types, details records, guard, widget and dialog, not verified by the gate

* wip(documents): translations and frontend for document metadata fields, not verified by the gate

* feat(documents): archive platform-document-metadata-fields, docs, e2e and plt-20 built

* fix(documents): split the document guard's required-field check out of refusal() and move the before-save subscriptions into SaveGuardSubscriptions

* fix(documents): three demo document types, and the before-save subscriptions as a constant
…hey are added (#1556)

* wip(agenda): office papers queued for PDF conversion through filinq, renditions recorded, package prefers the PDF; not verified by the gate

* wip(agenda): route for Try again and the conversion switch in the settings, not verified by the gate

* wip(agenda): Papers as PDF widget on meeting and agenda item pages, admin switch, translations; not verified by the gate

* feat(agenda): archive agenda-office-files-to-pdf, docs, e2e, seed and age-17 built

* fix(agenda): Try again answers 503 on an unreadable page, spec tags on the widget, schema strings in en and nl

* test: list the classes five tests use, so the CI coverage leg stops failing them as risky

FlowNodeRegistrarTest and OfficePaperAddedListenerTest (this change) and
ActivityPublicationTest and DecisionConfidentialityTest (inherited from
development, PublicationRepository) executed classes missing from their
@uses lists. Under Xdebug coverage with failOnRisky the stable34 pgsql
leg failed on them. Full suite with coverage: 2295 tests, 0 risky, exit 0.
…ts, and send the meeting file back after approval (#1557)

* wip(case-system): client, records, document fetch, decision list, meeting file (not verified)

* wip(case-system): exchange service, job, controller, routes, approval listener (not verified)

* test(case-system): exchange scenarios over an in-memory register validated with Opis

* test(case-system): controller, approval listener, connection and authorization expectations

* feat(case-system): case widget, fetch dialog, send button, case system widget, admin switch, seeds

* test(case-system): e2e scenarios for link, fetch, send and send again

* docs(case-system): feature page, design corrections, archive the change, rows plt-23 plt-24 built

* style(case-system): prettier and unused catch bindings

* l10n(case-system): strings in every shipped locale; phpcs line lengths

* fix(case-system): psalm casts and template, listener split for phpmd, seed slug under 36 characters, profile count

* wip: saved by the coordinator after the 30 Sep 09:51 WSL restart, not verified by the gate

* fix(case-system): gate findings from the verification run

psalm TypeDoesNotContainType on MinutesApprovedListener (the helper takes
an object), gate-49 CaseSystemController::forItem answers 503 when the
agenda item cannot be read, gate-66 MeetingFileService checks OpenRegister
is installed before reading item files (503 otherwise). @uses
PublicationRepository on two inherited tests, the same lines as #1556, so
the CI coverage leg stops failing them as risky.
…d axe scan and a manual checklist (#1560)

* feat(accessibility): a WCAG 2.1 AA audit report per release, from a sampled axe scan and a manual checklist

plt-22 (platform-accessibility-audit-report) tasks 1 to 4: the WCAG-EM
sample and its check, the axe-core scan with its own Playwright config and
owner attribution, the manual checklist, and the report generator with the
first (not yet scanned) report. Task 5, the scan on release builds, belongs
in the shared quality workflow (DECISIONS row 28); drafted for Ruben. Row
plt-22 stays building.

* style(accessibility): prettier and import order on the scan files; wait for the app root instead of networkidle (gate-58)
…d type, and give their own groups a decidiq role (#1563)

* feat(settings): administrators see who may read and change each record type, and give their own groups a decidiq role

plt-03 (platform-role-rights-per-record-type). The role to group mapping is
written into the register's authorization rules on import (DECISIONS row 22),
at the register baseline and in every schema block, so OpenRegister enforces
it. Archived; row built.

* fix(settings): gate findings on rights per record type (phpcs line length and docblocks, phpmd complexity, keep-open, prettier)
…ntation build (#1566)

* fix(accessibility): the audit report no longer breaks the docs build

The docs site builds Markdown as MDX, where {id} in the projection screen's
note is a JavaScript expression: the static build of
/docs/compliance/wcag-2.1-aa-audit/ failed with id undefined (documentation
deploy red on development since #1560). The generator now escapes braces and
'<'. Red test: the report must hold no bare brace or angle bracket.

* style(accessibility): prettier on the MDX test
…ecisions and minutes straight away, daily or weekly

Archives publication-subscriptions-and-daily-digest; pub-10 and pub-16 built.
rubenvdlinde and others added 30 commits October 9, 2026 23:03
The coverage ratchet on PR #1686 failed: GuestInvitationController had no
test (12 statements uncovered, changed files 84.23% against 87.50%). The
route now has tests for the 201 answer, a refusal with its own status and
message, and the empty session.
feat: build open OpenSpec changes (decidiq, part 2)
GovernanceBodyStateRequestedEvent is the read half of the governance-body
contract: a consumer (dossiq) asks by governanceBodyId or by its own
(sourceApp, externalReference) and gets the body back with active, quorum,
jurisdiction and the roster (uid, role, external), answered in process by
GovernanceBodyStateRequestedListener through GovernanceBodyQueryService.

Only the asking app's own bodies are returned, reads run as the acting user,
and a failed read leaves the event unhandled so the consumer falls back to its
own copy instead of treating a live committee as gone.

For dossiq migrate-committees-to-decidiq task 3. Spec: REQ-GBE-007.
…asses as templates

CnApprovalChainWidget takes reasonTemplates ([{id, name, body}], fallback
integrationContext.reasonTemplates). When given, a 'Start from a template'
picker sits above the reason field (acting yourself and on behalf); picking
fills the reason, which stays editable. decidiq reads no app's template
library. For dossiq starter-content-and-templates 7.2 (decision 156).
Change: openspec/changes/approval-reason-templates.
…rity for an act

DelegatedAuthorityCheck answers, for an account, an act key, an optional
amount and a moment, whether an in-force bevoegdheidstoedeling grants it.
The toedeling gains delegateUser, delegateGroup and acts (schema 0.2.0,
register 0.15.0). Every uncertain answer is no. decidiq still gates none
of its own Decision transitions (REQ-DMR-006): the asking app enforces.

Refactor lane R9, capability C17 (decisions 182, 184, 185).
…e delegated authority check names its moment parameter
…(subjectRegister, subjectSchema, subjectId)

A dossiq case session opens as a decidiq meeting and keeps a reference
to its session record (refactor C12, ADR-118, decision 191). Same
titles and descriptions as Decision's subject fields.
…e-body-read

feat(governance): a consumer app reads its governance body back
…reason-templates

feat(approval): the approval chain leaf offers ready-made reasons from its host
…1701)

* fix(settings): personal preferences move into the user settings dialog

Ruben, 11 Oct 2026: no user configuration pages. Decidiq drops its Nextcloud
personal settings page (/settings/user/decidiq): <personal> and
<personal-section> leave info.xml, with PersonalSettings, PersonalSection,
templates/settings/personal.php, src/personal.js, PersonalRoot.vue and the
webpack entry. The in-app /user-settings page (manifest.d/user-settings.json,
UserSettingsPage, the Preferences entry in the settings foldout) goes too:
it was the same five sections on a second page.

The five sections (notification preferences, display preferences,
delegation and absence, communication preferences, subscriptions) are now
sections of the user settings dialog (src/views/settings/UserSettings.vue in
CnAppRoot's #user-settings slot), reached from Personal settings in the
settings foldout or the #user-settings deep link. Filling the slot drops the
library's fallback, so its notifications pane, credentials and walkthrough
replay are drawn again from the app. No backend endpoint changes.

* test(settings): counts and the a11y sample follow the retired /user-settings page

* fix(settings): the user settings dialog follows board DcMijnInstellingen

Meldingen, Afwezigheid, Weergave, Contact, Abonnementen, in that order and
with those names. The library's generic notifications pane leaves the
dialog: the board draws one Meldingen section, which is decidiq's own.
Credentials and the walkthrough replay stay after the board's sections, the
walkthrough with Dutch labels (Rondleiding).

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
feat(mandates): another app can ask whether an account holds an authority for an act
feat(meetings): a meeting can point back at an object in another app
…st root (#1705)

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
* feat(ui): adopt nextcloud-vue 2.81.0 and the board look at the manifest root

* feat(ui): user settings dialog uses the library sections slot and Dutch strings

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
* wip(dashboard): inner scrollbar fix on the dashboard, unfinished and unverified (saved at wind-down, 13 Oct)

* fix(dashboard): no inner scrollbars on the dashboard (verified: scrollscan, gates)

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
…1712)

* feat(ui): meetings list to board DcVergaderingen: lenses with counts and the board's columns

Upcoming (default), This month, Completed and All as quick filters with
counts; columns Date and time, Body (title under it), Location, Agenda
items, Status, Chair; title, meeting type and mode stay as hidden
columns; soonest first; search placeholder 'Search in this list'.

* fix(ui): meetings list: no hidden-flag columns, no wrong counts on the date lenses, board footer note

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
…iten (#1714)

* feat(ui): bodies, decisions and commitments lists to boards DcOrganen, DcBesluiten, DcToezeggingen

Organen: lenses All, Governing bodies, Committees, Other bodies with
counts over bodyType; board headers. Besluiten: board headers Stage and
Validity. Toezeggingen: lenses as counted chips (All commitments, Open,
In execution, Over the deadline, Completed, Lapsed), the deadline as a
date that turns red when overdue. All three: search placeholder and the
footer note.

* fix(ui): commitments: five chips in view, today counts as late, spec follows the Still open lens

* revert(ui): commitments list leaves this PR; it ships with the board header (#1708)

* revert(l10n): the commitments lens strings move with the commitments list

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
…ipped example data (#1715)

The municipality and corporate example sets named a sitting mayor, Femke
Halsema, with f.halsema@amsterdam.nl, and other people on real mail domains
(amsterdam.nl, utrecht.nl, vng.nl, waterschap.nl, acme.nl), plus the real
address of Amsterdam's city hall (Amstel 1).

- Femke Halsema becomes the fictitious Wieteke Doornbos (slug
  wieteke-doornbos, user wieteke.doornbos, w.doornbos@gemeente.example);
  every reference to the slug moves with it, in the profiles, the register
  examples, the unit and e2e tests and the specs.
- Every e-mail domain in lib/Settings and in test fixtures moves to .example
  (gemeente, vereniging, waterschap, acme, raad, x).
- Amstel 1, Stadskantoor Utrecht and World Forum Den Haag become neutral
  addresses; the URL domain gemeente-voorbeeldingen.nl becomes .example.
* feat(example-sets): decidiq's part of the Zuiddrecht example set

Adds lib/Settings/example-sets/zuiddrecht.json for the cross-app example-set
loader (openregister#4603): the Gemeenteraad Zuiddrecht with 27 fictitious
members in six fictitious local parties and published voting records, the
college of a mayor and four aldermen, the cast's griffie employee bram as
griffier, three council and three college meetings with agendas, seven
decisions (among them the credit for lighting the Lindelaan cycle path and
the contract award to the cast's Installatiebedrijf Van Dam), and three
public named voting rounds with a vote per member. bram joins
decidiq-secretariat and decidiq-administrators. All dates are relative.

tests/example-sets/validate_example_set.py checks the fragment statically
against the merged register schemas. Data only; inert until #4603 merges.

* feat(example-sets): council on Thursday, college on Tuesday

Pins the Zuiddrecht meetings to their weekday with the loader's
{{datetime:<n>@thu 19:30}} and {{datetime:<n>@TUE 10:00}} (openregister#4603
at 473758abd). Every moment of a meeting (agenda published, opened, closed,
decisions, rounds, stages, votes, the day after for publication, the day
before for the motion) uses the meeting's own anchor shifted by whole days,
so it lands on the meeting's real day. Each meeting keeps its relative
position: two council and two college meetings in the past, one of each
ahead. The validator learns weekday dates, appConfig, the cast's generated
contactsUid and the refusal of the admin group.
…rounds (#1722)

Bump @conduction/nextcloud-vue to ^2.82.0. The Meetings index now uses
what 2.82 covers: counts on the Upcoming and This month lenses (flat
[gte]/[lt] keys count right), the Upcoming lens sorts soonest first while
the page reads newest first, the date tile with the end time, the chair as
avatar and name of the referenced participant, and title, meeting type and
mode declared hidden.

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
…tons, Acties menu) (#1708)

* feat(ui): adopt nextcloud-vue 2.81.0 and the board look at the manifest root

* feat(ui): index pages show the board header (title, count, add button)

* feat(ui): index headers keep download, import and refresh as header buttons

* feat(ui): index headers carry the board's Acties menu

Meetings, Motions, Decisions and Governance bodies take the nextcloud-vue
2.82 header Actions menu: Import, Copy selected, Delete selected, Refresh
and the Documentation link, as the boards draw them. The Import and
Refresh header buttons go, and with them the app strings they needed.

* fix(icons): register Import, Export and TrashCanOutline for the header Acties menu

The menu's Import and Delete selected entries drew the fallback glyph
because their icons were not in the app's registry.

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>
…s, Termijn) (#1716)

* feat(ui): commitments list to board DcToezeggingen: counted lens chips, the deadline as a date that turns red when due

All commitments, Open (key Still open: the catalogue translates Open as
the verb Openen), In execution, Over the deadline, Completed, and Lapsed
behind the overflow chip; search placeholder and footer note. Ships with
#1708 (the board header) after the nextcloud-vue release.

* feat(ui): commitments list takes the board header

Title, the count line and the header buttons (Download, the Acties menu,
add), as on the other board index pages, so the lens chips get their own
row under the title as board DcToezeggingen draws them.

---------

Co-authored-by: Ruben van der Linde <juan.claude@conduction.nl>

This branch has not been deployed

No deployments
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.

3 participants