quality / E2E Tests (Playwright) is red on development. The run at 13:48 (33255969802) was green; the run at 15:09 (33259463878) is red, and 140a7ad4 feat(types): introduce the configurable type layer (#957) is the only commit between them — it landed 5 seconds before the failing run started.
4 failed, 141 passed. One is fixed in #967 (the gov/assoc MODE_LABELS unification). These three are for the #957 workstream, because fixing them means deciding a data model that #957 is actively changing.
1 + 2. voting-rules.spec.ts:222 and :281 — the panel shows another motion's round
⚠️ This is a product defect, not only a test one.
VotingRoundPanel.fetchCurrentRound() scopes by:
this.objectStore.fetchCollection('voting-round', { 'relations.motion': this.motionId })
But VotingRound declares no motion property and no relations property. From lib/Settings/decidesk_register.json:
VotingRound -> votingMethod, isSecret, openedAt, closedAt, quorumWith, result,
votesFor, votesAgainst, votesAbstain, votingDeadline,
deadlineReminderSentAt, voteThreshold, abstentionHandling,
tieBreakRule, chairCastingVote, revoteOfRound, voteBase,
decisionStage
Its only declared link is decisionStage. The spec seeds the other side of the same non-existent shape:
relations: [{ register: 'decidiq', schema: 'motion', id: motionId }]
So neither side ever established the link. LiveMeeting.vue:560 already documents the dialect and warns against exactly this — a query key that is not a real schema property is classified as an object-field filter, and applyObjectFilters() appends 1 = 0.
Why it passed until now: the filter was inert, so fetchCurrentRound() effectively saw every voting-round in the register — and the test's own round was the only row. #957's register.d/70-configurable-types.json seeds three voting-rounds, so open || recent now selects a seeded one:
Expected substring: "Qualified majority (3/4)" ← the test's seed, base 10
Received string: "Rules: Simple majority (50%+1) · Abstentions excluded
from base · Tie: chair decides — base: 0"
That received string is the seed data (voteThreshold: simple-majority, no votes → base 0), not a component default — the rules paragraph only renders when currentRound is truthy. :222 is the same cause: its result-voting-rules block never renders because the round it finds is not the closed one it seeded.
The decision needed: how should a VotingRound be scoped to a Motion — through decisionStage, or by adding a real motion property? Once that is settled, the panel filter, the two seeds and the assertions all follow. I did not guess at it.
3. crud-persistence.spec.ts:405 — meeting edit does not persist
Expected: "e2e-1788018432457-5433-meeting-editbug-edited"
Received: "e2e-1788018432457-5433-meeting-editbug"
The dialog closes, but the object keeps its old title. #957 also touched the meeting surfaces (MeetingCalendarView.vue, MeetingViewToggle.vue, UpcomingMeetingsListWidget.vue) and added meeting-type configurable types, so this is most likely the same change — but I did not trace it to a specific mechanism and it should not be assumed.
cc the #957 author — the diagnosis above is also in #967's description.
quality / E2E Tests (Playwright)is red on development. The run at 13:48 (33255969802) was green; the run at 15:09 (33259463878) is red, and 140a7ad4feat(types): introduce the configurable type layer (#957)is the only commit between them — it landed 5 seconds before the failing run started.4 failed, 141 passed. One is fixed in #967 (the
gov/assocMODE_LABELS unification). These three are for the #957 workstream, because fixing them means deciding a data model that #957 is actively changing.1 + 2.
voting-rules.spec.ts:222and:281— the panel shows another motion's roundVotingRoundPanel.fetchCurrentRound()scopes by:But
VotingRounddeclares nomotionproperty and norelationsproperty. Fromlib/Settings/decidesk_register.json:Its only declared link is
decisionStage. The spec seeds the other side of the same non-existent shape:So neither side ever established the link.
LiveMeeting.vue:560already documents the dialect and warns against exactly this — a query key that is not a real schema property is classified as an object-field filter, andapplyObjectFilters()appends1 = 0.Why it passed until now: the filter was inert, so
fetchCurrentRound()effectively saw every voting-round in the register — and the test's own round was the only row. #957'sregister.d/70-configurable-types.jsonseeds three voting-rounds, soopen || recentnow selects a seeded one:That received string is the seed data (
voteThreshold: simple-majority, no votes → base 0), not a component default — the rules paragraph only renders whencurrentRoundis truthy.:222is the same cause: itsresult-voting-rulesblock never renders because the round it finds is not the closed one it seeded.The decision needed: how should a VotingRound be scoped to a Motion — through
decisionStage, or by adding a realmotionproperty? Once that is settled, the panel filter, the two seeds and the assertions all follow. I did not guess at it.3.
crud-persistence.spec.ts:405— meeting edit does not persistThe dialog closes, but the object keeps its old title. #957 also touched the meeting surfaces (
MeetingCalendarView.vue,MeetingViewToggle.vue,UpcomingMeetingsListWidget.vue) and addedmeeting-typeconfigurable types, so this is most likely the same change — but I did not trace it to a specific mechanism and it should not be assumed.cc the #957 author — the diagnosis above is also in #967's description.