Files
portal/vendor/trainer/runs/permits-plan-2026-09-30/plan.yaml
T
Bendik Aagaard Lynghaug bedd306854 Bring the trainer in (uhhm/portal-trainer main, history kept)
git-subtree-dir: vendor/trainer
git-subtree-mainline: c7c2956e15
git-subtree-split: a2a9f4edcf
2026-09-30 15:23:15 +02:00

550 lines
25 KiB
YAML

business: Vestmark kommune - Building and Planning
language: en
contact: { name: Solveig Hauge, email: byggesak@vestmark.example }
about: >
We are the building authority for a municipality of twenty-one
thousand people. Anyone who wants to build, demolish, divide a
property or change what a building is used for has to come to us
first. We check the drawings against the zoning map and the building
regulations, we let the neighbours and the other authorities have
their say, and then we approve or refuse. We also decide exemptions
from the zoning rules, we inspect what is actually built, we sign off
finished work, and we deal with building that was never applied for.
mail: { from: "Vestmark kommune Building and Planning <post@vestmark.example>", reply_to: byggesak@vestmark.example }
does:
- id: check-and-decide
for: application
text: >
We check your drawings against the zoning map and the building
regulations, let the neighbours and the other authorities have
their say, and then approve or refuse. Every case is on the list
here, so you and your neighbours can follow it the whole way,
and object to it or appeal it from its own row.
- id: firms-file-here
for: firm-application
text: >
Approved firms file applications for their clients here, see what
is missing and ask for the completion certificate when the work is done.
doors:
- id: build
who: You want to build, demolish, divide a property or change what a building is used for
- id: firm
who: You are an architect or an engineering firm filing on behalf of owners
invites_by: [head_of_section]
needs:
- id: pre-application-meeting
who: Anyone who wants to sit down with us before they spend money on drawings
wants: A meeting with a case officer, and a written note of what we told them
door: build
lands_in: pre_application_meetings
handled_by: case_officers
stages: [open, scheduled, met, written_up, cancelled]
done_when: [written_up, cancelled]
success: [written_up]
turned_down_from: [open, scheduled]
moves_by: { cancelled: [submitter, case_officers] }
watched_by: [front_desk]
mails: { open: submitter, scheduled: submitter, written_up: submitter, cancelled: submitter }
stages_text:
open: asked for
scheduled: time found
met: meeting held
written_up: written down and sent
cancelled: cancelled
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: property_address }
- { name: what_you_plan, type: textarea }
- { name: phone, type: tel, optional: true }
- { name: place, type: location, optional: true }
- id: application
who: A homeowner who wants a garage, an extension, a new window or another change to their property
wants: Permission to build, demolish, divide a property or change what a building is used for
door: build
lands_in: applications
handled_by: case_officers
stages: [open, papers_missing, papers_received, complete, in_hearing, hearing_over, recommended, approved, approved_with_conditions, refused, withdrawn]
done_when: [approved, approved_with_conditions, refused, withdrawn]
success: [approved, approved_with_conditions]
skippable: [papers_missing, papers_received]
reached_from:
papers_missing: [open, papers_received, complete, in_hearing]
refused: [recommended]
moves_by:
papers_received: [submitter]
approved: [head_of_section]
approved_with_conditions: [head_of_section]
refused: [head_of_section]
withdrawn: [submitter, case_officers]
watched_by: [public, front_desk, inspectors]
public_states: [open, papers_missing, papers_received, complete, in_hearing, hearing_over, recommended, approved, approved_with_conditions, refused]
mails:
open: submitter
papers_missing: submitter
complete: submitter
in_hearing: submitter
approved: submitter
approved_with_conditions: submitter
refused: submitter
withdrawn: submitter
deadlines: { in_hearing: { days: 42, to: hearing_over } }
stages_text:
open: received
papers_missing: "papers missing, clock stopped"
papers_received: missing papers sent in
complete: "complete, clock running"
in_hearing: out to neighbours and agencies
hearing_over: hearing over
recommended: recommendation written
approved: approved
approved_with_conditions: approved with conditions
refused: refused
withdrawn: withdrawn
max_fields: 5
collects:
- { name: name, private: true }
- { name: email, type: email, private: true }
- { name: property_address }
- { name: kind_of_work, type: select, options: [New building, Extension, Garage or outbuilding, Window or facade change, Demolition, Dividing a property, Change of use] }
- { name: what_you_want_to_do, type: textarea }
- { name: enclosed, type: select, multiple: true, optional: true, options: [Site plan, Floor plans, Elevations, Section drawing, Neighbour notices sent, Statement from the owner] }
- { name: phone, type: tel, optional: true, private: true }
- { name: place, type: location, optional: true }
- id: firm-application
who: An approved architect or engineering firm filing on behalf of an owner
wants: To file a building application for a client and see what is missing
door: firm
enters_as: approved_firms
requires: Your firm must be on our list of approved firms before it may file anything.
lands_in: applications
handled_by: case_officers
stages: [open, papers_missing, papers_received, complete, in_hearing, hearing_over, recommended, approved, approved_with_conditions, refused, withdrawn]
done_when: [approved, approved_with_conditions, refused, withdrawn]
success: [approved, approved_with_conditions]
skippable: [papers_missing, papers_received]
reached_from:
papers_missing: [open, papers_received, complete, in_hearing]
refused: [recommended]
moves_by:
papers_received: [submitter]
approved: [head_of_section]
approved_with_conditions: [head_of_section]
refused: [head_of_section]
withdrawn: [submitter, case_officers]
watched_by: [public, front_desk, inspectors]
public_states: [open, papers_missing, papers_received, complete, in_hearing, hearing_over, recommended, approved, approved_with_conditions, refused]
mails:
open: submitter
papers_missing: submitter
complete: submitter
in_hearing: submitter
approved: submitter
approved_with_conditions: submitter
refused: submitter
withdrawn: submitter
deadlines: { in_hearing: { days: 42, to: hearing_over } }
stages_text:
open: received
papers_missing: "papers missing, clock stopped"
papers_received: missing papers sent in
complete: "complete, clock running"
in_hearing: out to neighbours and agencies
hearing_over: hearing over
recommended: recommendation written
approved: approved
approved_with_conditions: approved with conditions
refused: refused
withdrawn: withdrawn
max_fields: 6
collects:
- { name: name, private: true }
- { name: email, type: email, private: true }
- { name: property_address }
- { name: kind_of_work, type: select, options: [New building, Extension, Garage or outbuilding, Window or facade change, Demolition, Dividing a property, Change of use] }
- { name: what_you_want_to_do, type: textarea }
- { name: enclosed, type: select, multiple: true, options: [Site plan, Floor plans, Elevations, Section drawing, Neighbour notices sent, Statement from the owner] }
- { name: owner_name, optional: true, private: true }
- { name: phone, type: tel, optional: true, private: true }
- { name: place, type: location, optional: true }
- id: exemption
who: An applicant whose plans break the zoning rules
wants: An exemption from the zoning rules, decided alongside their application
about: application
requires: An application with us; the exemption rides along with it and is asked for from its row on the list of cases.
lands_in: exemptions
handled_by: case_officers
stages: [open, county_asked, county_heard, granted, refused]
done_when: [granted, refused]
success: [granted]
moves_by: { granted: [head_of_section], refused: [head_of_section] }
watched_by: [front_desk]
mails: { open: submitter, county_asked: submitter, granted: submitter, refused: submitter }
deadlines: { county_asked: { days: 42, to: county_heard } }
stages_text:
open: received
county_asked: county asked
county_heard: county has answered or its deadline has passed
granted: granted
refused: refused
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: rule_it_breaks }
- { name: why_it_should_be_allowed, type: textarea }
- id: objection
who: A neighbour who got a notice in the post and does not agree with what is planned next door
wants: To object to an application and have the objection answered in the decision
about: application
requires: The application must still be out for hearing; objections are taken until the six weeks are up.
lands_in: objections
handled_by: case_officers
stages: [open, registered, answered, addressed]
done_when: [addressed]
success: [addressed]
skippable: [answered]
moves_by: { registered: [front_desk, case_officers], answered: [approved_firms, case_officers] }
watched_by: [front_desk, head_of_section]
mails: { open: submitter, registered: owner, addressed: submitter }
stages_text:
open: received
registered: registered on the case
answered: answered by the applicant
addressed: addressed in the decision
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: your_property }
- { name: objection, type: textarea }
- { name: phone, type: tel, optional: true }
- id: logged-objection
who: The front desk, when an objection comes in on paper or over the counter
wants: To put the objection on the right case straight away, instead of stapling it to a folder
enters_as: front_desk
lands_in: paper_objections
handled_by: case_officers
stages: [open, registered, answered, addressed]
done_when: [addressed]
success: [addressed]
skippable: [answered]
moves_by: { registered: [front_desk, case_officers], answered: [approved_firms, case_officers] }
watched_by: [front_desk, head_of_section]
stages_text:
open: received
registered: registered on the case
answered: answered by the applicant
addressed: addressed in the decision
max_fields: 5
collects:
- { name: application_reference }
- { name: name }
- { name: objection, type: textarea }
- { name: received_on, type: date }
- { name: your_property, optional: true }
- { name: phone, type: tel, optional: true }
- id: hearing-request
who: A case officer who is obliged to ask another authority about an application
wants: To ask the road authority, the fire service, the heritage office or the county, and go on when the deadline has passed
enters_as: case_officers
lands_in: hearing_answers
handled_by: case_officers
stages: [open, answered, no_answer]
done_when: [answered, no_answer]
success: [answered]
moves_by: { answered: [agencies, case_officers] }
watched_by: [agencies, front_desk]
deadlines: { open: { days: 42, to: no_answer } }
stages_text:
open: asked
answered: answered
no_answer: deadline passed without an answer
max_fields: 4
collects:
- { name: application_reference }
- { name: agency, type: select, options: [Road authority, Fire service, Heritage office, County] }
- { name: what_we_ask, type: textarea }
- { name: answer_by, type: date, optional: true }
- id: appeal
who: Anyone with an interest in a decision, the applicant or a neighbour
wants: To appeal a decision we have made
about: application
requires: A decision on the application, made no more than three weeks ago.
lands_in: appeals
handled_by: case_officers
stages: [open, under_review, decision_changed, sent_to_board, upheld, overturned, dismissed]
done_when: [decision_changed, upheld, overturned, dismissed]
success: [decision_changed, upheld, overturned]
turned_down_from: [open, under_review]
reached_from: { decision_changed: [under_review] }
moves_by: { decision_changed: [head_of_section], upheld: [appeals_board], overturned: [appeals_board] }
watched_by: [appeals_board, head_of_section, front_desk]
mails: { open: submitter, decision_changed: submitter, sent_to_board: submitter, upheld: submitter, overturned: submitter, dismissed: submitter }
stages_text:
open: received
under_review: we are going through it ourselves
decision_changed: we changed our own decision
sent_to_board: sent to the appeals board
upheld: decision upheld by the board
overturned: decision overturned by the board
dismissed: dismissed
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: your_interest, type: select, options: [I am the applicant, I am a neighbour, Other] }
- { name: grounds, type: textarea }
- { name: phone, type: tel, optional: true }
- id: illegal-building-report
who: Someone who sees something going up behind their fence without permission
wants: To tell us, so that we go and look
lands_in: illegal_building
handled_by: case_officers
stages: [open, inspected, owner_written_to, explained, fined, applied_for, taken_down, nothing_illegal]
done_when: [applied_for, taken_down, nothing_illegal]
success: [applied_for, taken_down]
skippable: [fined]
turned_down_from: [open, inspected, explained]
moves_by: { inspected: [inspectors], fined: [head_of_section] }
watched_by: [front_desk, inspectors]
stages_text:
open: reported
inspected: we have been and looked
owner_written_to: owner written to
explained: owner has explained
fined: weekly fine running
applied_for: applied for properly
taken_down: taken down
nothing_illegal: nothing illegal found
max_fields: 3
collects:
- { name: where }
- { name: what_is_being_built, type: textarea }
- { name: place, type: location, optional: true }
- { name: name, optional: true, private: true }
- { name: phone, type: tel, optional: true, private: true }
- id: logged-report
who: The front desk, when someone rings or comes in about building without permission
wants: To log the report so an inspector goes and looks
enters_as: front_desk
lands_in: illegal_building
handled_by: case_officers
stages: [open, inspected, owner_written_to, explained, fined, applied_for, taken_down, nothing_illegal]
done_when: [applied_for, taken_down, nothing_illegal]
success: [applied_for, taken_down]
skippable: [fined]
turned_down_from: [open, inspected, explained]
moves_by: { inspected: [inspectors], fined: [head_of_section] }
watched_by: [front_desk, inspectors]
stages_text:
open: reported
inspected: we have been and looked
owner_written_to: owner written to
explained: owner has explained
fined: weekly fine running
applied_for: applied for properly
taken_down: taken down
nothing_illegal: nothing illegal found
max_fields: 3
collects:
- { name: where }
- { name: what_is_being_built, type: textarea }
- { name: place, type: location, optional: true }
- { name: name, optional: true, private: true }
- { name: phone, type: tel, optional: true, private: true }
- id: inspection
who: An inspector on site, writing on a phone in a cold wind
wants: To write up what was found on a case and set a date for what must be put right
enters_as: inspectors
lands_in: inspections
handled_by: inspectors
stages: [open, to_put_right, as_approved]
done_when: [as_approved]
success: [as_approved]
skippable: [to_put_right]
watched_by: [case_officers, head_of_section]
stages_text:
open: inspected
to_put_right: "to be put right, then we go back"
as_approved: as approved
max_fields: 3
collects:
- { name: application_reference }
- { name: finding, type: select, options: [As approved, Something is wrong] }
- { name: what_is_wrong, type: textarea, optional: true }
- { name: put_right_by, type: date, optional: true }
- { name: place, type: location, optional: true }
- id: completion-certificate
who: An approved firm whose work on a case is done
wants: A completion certificate for the finished work
door: firm
enters_as: approved_firms
requires: Your firm must be on our list of approved firms, and the application must be approved; have its reference ready.
lands_in: completion_certificates
handled_by: case_officers
stages: [open, checked, issued, refused]
done_when: [issued, refused]
success: [issued]
moves_by: { issued: [head_of_section], refused: [head_of_section] }
watched_by: [inspectors, front_desk]
mails: { open: submitter, issued: submitter, refused: submitter }
stages_text:
open: asked for
checked: inspections and outstanding work checked
issued: certificate signed
refused: refused
max_fields: 5
collects:
- { name: name }
- { name: email, type: email }
- { name: application_reference }
- { name: finished_on, type: date }
- { name: what_was_built, type: textarea, optional: true }
- { name: still_outstanding, type: textarea, optional: true }
- id: temporary-permission
who: An approved firm whose client wants to move in before everything is done
wants: A temporary permission to use the building
door: firm
enters_as: approved_firms
requires: Your firm must be on our list of approved firms, and the application must be approved; have its reference ready.
lands_in: temporary_permissions
handled_by: case_officers
stages: [open, checked, issued, refused]
done_when: [issued, refused]
success: [issued]
moves_by: { issued: [head_of_section], refused: [head_of_section] }
watched_by: [inspectors, front_desk]
mails: { open: submitter, issued: submitter, refused: submitter }
stages_text:
open: asked for
checked: inspections and outstanding work checked
issued: temporary permission signed
refused: refused
max_fields: 6
collects:
- { name: name }
- { name: email, type: email }
- { name: application_reference }
- { name: move_in_on, type: date }
- { name: still_outstanding, type: textarea }
- { name: finished_by, type: date, optional: true }
- id: firm-approval
who: An architect or engineering firm that wants to file applications for owners
wants: To be approved by us and put on the list of firms that may file
door: firm
lands_in: approved_firm_requests
handled_by: case_officers
stages: [open, checked, listed, refused]
done_when: [listed, refused]
success: [listed]
moves_by: { listed: [head_of_section], refused: [head_of_section] }
watched_by: [public, front_desk]
public_states: [listed]
mails: { open: submitter, listed: submitter, refused: submitter }
grants: { listed: approved_firms }
stages_text:
open: received
checked: "registration, insurance and qualifications checked"
listed: on the list
refused: refused
max_fields: 6
collects:
- { name: firm }
- { name: name, private: true }
- { name: email, type: email, private: true }
- { name: registration_number }
- { name: insurance, private: true }
- { name: qualified_for, type: select, multiple: true, options: [Applying on behalf of owners, Architectural design, Structural engineering, Fire safety design, Geotechnical engineering, Carrying out the work, Independent control] }
- { name: phone, type: tel, optional: true, private: true }
# Held out from every model that writes words.
personas:
- id: garage-owner
need: pre-application-meeting
text: We want to put a double garage where the old shed is. Before I pay an architect I'd like to know whether you'll even allow it, because the neighbour says it's too close to the road.
- id: shop-to-flats
need: pre-application-meeting
text: I own the old grocery on Torget and want to make four flats out of it. There are a lot of questions - parking, fire, the facade is listed. Can we sit down with someone?
- id: firm-files-extension
need: firm-application
text: We are the responsible applicant for an extension at Bjorkeveien 14. Drawings, site plan and the neighbour notices are all ready. We file maybe forty of these a year.
- id: owner-small-window
need: application
text: I want to put a dormer window in my roof. The man at the counter said I have to apply even though it's small.
- id: missing-drawings
need: firm-application
text: You wrote that our section drawing is missing and the case is on hold. I've got it here now, where do I send it so the clock starts again?
- id: too-close-to-boundary
need: exemption
text: The garage ends up one and a half metres from the boundary and the plan says four. We are asking you to allow it anyway - the ground falls away steeply everywhere else on the plot.
- id: neighbour-view
need: objection
text: I got a notice about the extension at number 14. It takes the afternoon sun off my entire terrace and I want that on the record before you decide anything.
- id: neighbour-parking
need: objection
text: The flats they want to build in the old grocery have four parking places for four flats and everyone here already parks on the street. I object.
- id: road-authority
need: hearing-request
text: 'Regarding your case 2026/418: the access onto the county road is within the sight line and we cannot accept it as drawn. Our formal reply is attached.'
- id: fire-service
need: hearing-request
text: We have looked at the conversion on Torget. We have no objection provided the stairwell is upgraded. Reference your case 2026/501.
- id: refused-applicant
need: appeal
text: You refused our exemption on the ninth. We don't accept the reasoning - you've allowed the same thing twice in the same street. We're appealing.
- id: neighbour-appeals
need: appeal
text: You approved the extension next door even though I objected. I'm appealing the decision. What do I need to send?
- id: board-member
need: appeal
text: I sit on the appeals board. I need the case, our own decision, and what the neighbours wrote, before Tuesday.
- id: inspector-on-roof
need: inspection
text: I'm up on the scaffold at Bjorkeveien. The fire wall isn't built to the drawing at all. I've got gloves on and it's blowing. I want this logged before I climb down.
- id: inspector-all-good
need: inspection
text: Been out at Torget. Everything is as approved. Nothing to report but I have to record that I was there.
- id: firm-wants-certificate
need: completion-certificate
text: The work at Bjorkeveien 14 is finished and inspected. We're asking for the completion certificate so the owners can get their mortgage released.
- id: wants-to-move-in
need: temporary-permission
text: The house is done apart from the outside steps, which we can't pour until spring. The family has sold their flat. Can we get a temporary permission to move in?
- id: something-behind-fence
need: illegal-building-report
text: There's a large structure going up behind the fence at Solbakken 7. Nobody has had a notice about it and it's been going on for two weeks.
- id: owner-explains
need: illegal-building-report
text: I got your letter about the terrace. I genuinely did not know it needed an application, it's been there since we moved in. What happens now?
- id: new-firm
need: firm-approval
text: We are a three-person architecture firm that has just started. We want to be approved so we can file applications for our clients in your municipality.
- id: firm-insurance-lapsed
need: firm-approval
text: You wrote that our liability insurance certificate has expired. We have renewed it, here it is.
- id: counter-phone-call
need: log-counter-enquiry
text: A woman rang about the case behind her house. Wants to know where it stands. I'm at the counter and there's a queue - I need to write it down and send it to whoever has that case.
- id: where-is-my-case
need: case-status-enquiry
text: I sent in my application five weeks ago and I've heard nothing. Is anyone looking at it? Is it in the six weeks with the neighbours or is it waiting on me?