Planned, not built. This page is the story map agreed on 2026-10-30 after a design grilling. The decisions behind it are in engram under
odd/endringsforslag/decisions (per-question answers in odd/endringsforslag/answers-1 to answers-8), the competitor and procedure research under research/endringsforslag-reference. The Linear project «Endringsforslag» (P-VOT-33) has one issue per slice, listed in the slice table below. When a slice ships, its detail moves to domenemodell.mdx and arkitektur.mdx and this page keeps the map.Why
tilvotering runs the vote. Until now the secretary writes every question by hand, and nothing a delegate wants to change reaches the app before the chair reads it from the rostrum. Landsmøter, ting and synoder (the product’s core customers) work the other way round: forslag arrive weeks ahead, a redaksjonskomité sorts and tidies them, and the meeting votes its way through a voteringsorden. This feature brings that flow into the app in three steps that follow the meeting’s own states:- Sakspapirer before the meeting. Delegates sign in while the meeting is in forberedelse and submit forslag on the saker the secretariat has opened. A Redaksjonskomité approves, numbers and edits them, with every edit kept as a version with a comment.
- Forslag in the meeting. The sak’s forslag are on every screen: the delegate’s, the chair’s and the projector. New ones come from the floor until the sak is closed for forslag: by its forslagsfrist, by hand, or by strek.
- The text question. A sak about a text (vedtekter, a program, an uttalelse) carries the text with line numbers. Amendments are strike-and-add on a line range, the app proposes the voteringsorden, generates the chain of polls, marks what falls, and produces the final text.
Personas
The map at a glance
Activities follow the meeting flow from left to right. Each cell lists the stories a release adds to that activity; the stories themselves are in the tables below.Stories
Each story names its persona and the slice that builds it (slice numbers are in the table at the end). A story is one observable behaviour; its acceptance details are written in the slice’s issue and feature document, not here.A. Set up the meeting
B. Open a sak for forslag
C. Submit a forslag
D. Review and edit
E. Build the vote
F. Vote
G. Record
States of a forslag
A proposal for the domain model, to be fixed in slice 2 and extended by slice 5:
Numbering is per sak in approval order, shown with the sak’s number («Forslag 7.3»), assumption to confirm in slice 2.
Slices and releases
One Linear issue per slice, with the stories as its sub-task checklist. Sizes are the owner’s S/M/L scale for a batch, not estimates in hours. Release 1 is the first that is worth selling; the rest ship slice by slice as they are done, without a target date.
Dependencies read: slice 3 needs the forslag of slice 2 and the versions of slice 1. Slice 8 stands alone (the owner’s request of 2026-10-30: many organisations give the forslagsstiller’s intro more time than an innlegg); only its automatic placement waits for slice 1. Slice 1 is deliberately first and alone: it changes saker and options that exist today, and it is the only slice that touches the protokoll before any delegate can submit.
Constraints every slice respects
- No in-process state: production runs two Puma workers; coalescing and throttles go through Solid Cache and Solid Cable.
- Broadcast streams: a new or changed forslag is a structural change on
[meeting, "updates"], coalesced like a talerliste sign-up; a step’s result travels as a refresh, never as a tally. - The capability matrix: submitting, reviewing and ordering are capabilities keyed by meeting state, so a closed meeting refuses them with the standard message and no role bypass.
- Rehearsal: forslag are real data in forberedelse; «Start møte» and «Nullstill møte» leave them alone and the purge list says so explicitly. Bots never submit forslag.
- The one-screen participant view at about 375 px: forslag arrive as a bottom sheet and a pre-meeting saksliste, never a second screen during the meeting.
- The question lock: no version of a question, a body or a forslag once a round on the sak has opened.
- Protokoll schema 2.x is additive only; every new key is documented in
protokoll-json-schema.mdxbefore it ships. - The projector widget catalogue gets two keys; both render in every meeting state and in the projector’s own
--pj-*tokens. - Norwegian UI, English code and docs. UI terms: forslag, endringsforslag, tilleggsforslag, innkommet sak, forslagsstiller, saksansvarlig, redaksjonskomité, voteringsorden, «Samlet votering», «Bortfalt», «Oversendt», «Forslagsfrist», «Lukk for forslag», «Etter fristen»; strek and «Slipp inn» belong to the talerliste only.
Assumptions and open points
Assumptions written into the stories above, each to be confirmed in its slice:- The secretariat may register a forslag on someone’s behalf (C7); the owner’s answer implied it without saying so.
- Two deadlines, two vocabularies: the forslag window («Åpen for forslag», «Forslagsfrist», «Lukk for forslag») and the talerliste’s strek; the words are never mixed. Strek also closes forslag by default (A6). A late forslag is admitted by «Godkjenn» with no in-app consent count; the chair or the committee records the room’s consent by clicking.
- Numbering is per sak in approval order («Forslag 7.3»).
- Merging two forslag is done by hand (D5); no automatic jamking.
- Proposer names are meeting data and visible to every participant, as in every competing tool.
- Reservasjoner (dissent recorded against a decision) are out of scope for all slices.
- Inference of what falls from overlapping line ranges is out of scope; the owner chose explicit dependencies only. It can return as a suggestion in slice 6 if the committee’s work proves heavy.
Mockups
Mockups cover the full vision with the first release marked, underMockup/endringsforslag/v1-<description>/, one folder per iteration. The example mockup walks two cases end to end: an innkommet sak from a fylkeslag with the body as forslagsstiller (slices 2 and 3), and a benkeforslag in an election (slice 4 with E1).