Skip to content

Release: merge development into beta - #1304

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

github-actions[bot] wants to merge 362 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 14:20
…stops failing them as risky (#1521)

The PHPUnit (PHP 8.3, NC stable34, pgsql) job runs with Xdebug coverage, and
phpunit.xml sets beStrictAboutCoverageMetadata and failOnRisky. Under coverage,
25 flow tests executed classes their @covers/@uses did not name, so the run
ended 'OK, but there were issues' with exit code 1. Local runs have no coverage
driver and never saw it.
…1523)

Build 5 in 5 new changes (bod-08 bod-13 pla-12 age-13 rou-01), existing 10
(proposals now name vot-05 vot-18 age-11 age-12 age-15 pub-11 par-09 pub-18
rou-09 rou-12), decided no 10 (mot-10 vot-09 vot-10 fol-07 rou-06 pub-06 par-12
rou-15 pub-07 plt-08).
… body's members (#1525)

MinutesService asked the container for an OpenRegisterNotificationService that
nothing registers, so submitting minutes told nobody; it also picked every chair
and secretary of every body. It now reads the meeting's body through
ParticipantResolver and delivers through NotificationPreferenceService.
generateALVDraft counted members with a _relations.governance-body filter that
matches no object-API participant (always 0); it now counts the body's current
members through ParticipantResolver. ParticipantNotifier and four resolver
methods lost their last caller and are removed.
…, and decisions, speeches and questions are recorded on it (#1527)

* feat(live): the meeting holds the current agenda item, and a live decision names its meeting, item and type

Fragment 105 adds Meeting.currentAgendaItem (Meeting 1.9.0). LiveDecisionService
wrote an undeclared relations key, no decisionType (required) and saved to
schema 'Decision'; it now writes meeting, agendaItem, decisionType (default
resolution) and an outcome only when one was taken.

* wip: mid-task state when the lane was killed by the weekly limit (29 Sep 16:05); not verified

* feat(live): the chair's current item is saved by a guarded endpoint, not by a meeting save any member could make

PUT /api/agendas/{meetingId}/current-item (chair, secretary or admin) checks the
item is on the meeting and patches Meeting.currentAgendaItem. Verifies the wip
commit 17e23a5: 50 l10n files generated, 9 hand edits read; room screen is a
section, not a second main landmark.

* feat(live): speeches and questions list under the item they were on; archive live-meeting-shared-current-item

The speaker queue lists the contributions on the current item from the
meeting's engagement records. Change archived into agenda-live-management;
rows liv-01 liv-04 liv-05 liv-11 built.

* fix(live): room screen as the live page's projector mode, current item in its own service; gate fixes

phpmd class complexity: setCurrentItem moves to CurrentAgendaItemService.
gate-69 custom-page ratchet: no new custom page, /meetings/:id/live?view=screen.
eslint: unused catch bindings and console calls in touched files fixed,
suppressions pruned (10 fewer).
…he moment an agenda item started (#1530)

* feat(transcription): the meeting recording plays for its participants and seeks by byte range

GET /api/transcripts/{transcriptId}/recording (any participant of the meeting,
chair, secretary, admin) answers a Range request with 206 and those bytes.

* feat(transcription): Play from here on each agenda item of the transcript; archive live-recording-jump-to-item, row liv-08 built

* refactor(transcription): the recording player gets its own controller; the guard takes who it admits instead of a flag (phpmd coupling and boolean-flag findings)

* fix(transcription): drop a redundant cast psalm reports
…s and a faction; faction pages get a workspace (#1533)

Archive bodies-membership-terms-contacts-and-factions, rows bod-02 bod-06 bod-16 built.
…ce, and unreadable restrictions publish nothing (red on development)
…y public surface, and the published agenda carries its items, papers and filter fields
…ed object service, agenda items titled, named arguments, e2e formatted, remedy test gets the papers service)
…s and a manifest, and is told where to download it (red)
…eting files and a manifest in one archive, and gets a notification with the download link
rubenvdlinde and others added 30 commits October 9, 2026 07:16
…hat silence means and when the substitute is asked
…are the registry as used by the controller test
feat: build open OpenSpec changes (decidiq, part 1)
Decision 131 (Q-decidiq-1): the regulations register folded into governing
documents and the STOP/TPOD export moved to integriq. Archived with a note,
nothing folded into the main specs.
…a shared body

BodyParticipationsTab with add, edit and end participation, seats filled
per organisation, and On behalf of in the add-member dialog (bod-13).
Tests pending the worktree install.
…email; a planning cycle gets its steps from its template

Guest invitations (pla-20, board DcAdhocOverleg): Gast uitnodigen on the
participants of a meeting without a body, a guest participant, one mail
with date, agenda and a read-only link to the papers; only the organiser
or an administrator. Planning cycle (pla-12): steps generated once from
the template on create, Steps widget with an Overdue badge.
Tests pending a free slot.
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.
…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>

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