runs: the contractor planned end to end, 7 of 8 across seeds

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-24 02:32:30 +02:00
co-authored by Claude Fable 5.1
parent 209e9d1258
commit d132f1e4df
38 changed files with 3482 additions and 0 deletions
@@ -0,0 +1,19 @@
# The contractor, planned end to end, 2026-09-24
The first site made with no hand in it after the intake: `plan` with
Sonnet against the reference that now teaches the opener, the sender,
the mails and the guards; the ten held-out construction personas
mapped to the plan's need ids by a second model call (ids only, after
the plan was final); `build` with Sonnet writing the words and iris
green; then the visitor.
- Plan: 5 needs, 3 groups, 4 buckets, an opener for the two owner
roles, a sender, mails on four needs. The builder warned twice, and
rightly: neither featured owner got a move after sending. That is
the plan model's omission and the reader's to fix before shipping.
- Score with descriptions, three seeds: 7, 7, 6 of 8. The hand-written
contractor plan of 2026-09-21 scored 8 of 8 on the same personas,
one seed. Inside the spread of each other; the planned site is as
good as the hand-planned one on routing, and it took one command.
- Not done here: rating, and the headings-only pass, which the noise
floor says would not have told us anything.
@@ -0,0 +1,8 @@
{"choice":"Get someone out to look at it","confidence":0.95,"id":"housing-board-damp@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"buyer-before-purchase@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"attic-conversion@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"shop-to-flat@/"}
{"choice":"Get on our list of subcontractors","confidence":0.95,"id":"electrician-firm@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"scaffolder@/"}
{"choice":"Ask if we're hiring","confidence":0.95,"id":"carpenter-jobseeker@/"}
{"choice":"Ask if we're hiring","confidence":0.95,"id":"apprentice@/"}
@@ -0,0 +1,8 @@
{"choice":"Get someone out to look at it","confidence":1.0,"id":"housing-board-damp@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"buyer-before-purchase@/"}
{"choice":"Get drawings, a permit and a price","confidence":1.0,"id":"attic-conversion@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"shop-to-flat@/"}
{"choice":"Get on our list of subcontractors","confidence":0.95,"id":"electrician-firm@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"scaffolder@/"}
{"choice":"Ask if we're hiring","confidence":0.95,"id":"carpenter-jobseeker@/"}
{"choice":"Ask if we're hiring","confidence":0.95,"id":"apprentice@/"}
@@ -0,0 +1,8 @@
{"choice":"Get someone out to look at it","confidence":0.95,"id":"housing-board-damp@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"buyer-before-purchase@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"attic-conversion@/"}
{"choice":"Get drawings, a permit and a price","confidence":0.95,"id":"shop-to-flat@/"}
{"choice":"Get on our list of subcontractors","confidence":1.0,"id":"electrician-firm@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"scaffolder@/"}
{"choice":"Ask if we're hiring","confidence":0.95,"id":"carpenter-jobseeker@/"}
{"choice":"Get someone out to look at it","confidence":0.95,"id":"apprentice@/"}
@@ -0,0 +1,158 @@
# plan.yaml
A plan is a needs spec that also says what each form collects. A
builder turns it into a working site with no further decisions, so
every structural fact about the business has to be in it.
```yaml
business: <name>
language: en # the intake's language code
contact: { name: <who answers for the site>, email: <their email> }
about: >
What the business does, in its own words.
mail: { from: "<name> <post@their-domain>", reply_to: <their inbox> }
# who every mail the site sends comes from; required as soon
# as any need has `mails`
does: # the front door's first card: what the business does, one
- id: kebab-case # or two features, one role each, no button. Say it for the
for: <need id> # role the business exists for and the next one it serves.
text: what it does for them, in the intake's own words
shows: # things a visitor may look at before asking for anything;
- id: kebab-case # each `resource` is portal's resource block, verbatim
text: one line on what it is
resource: { public: true, source: { kind: url, url: https://... } }
doors: # a first question before the forms, only when the offers
- id: kebab-case # are more than one page holds (measured: four doors beat
who: who comes through it # ten offers on one page; six offers on one page beat doors)
groups: # groups with a label the public may see: the committees
- { id: traffic, label: Traffic, invited_by: [board] } # a person can ask to join (optional)
invites_by: [board] # groups whose desk may invite people into every desk
needs:
- id: kebab-case # ASCII only
who: the kind of person, in plain words, in the intake's language
wants: what they want from the business
door: <door id> # the door this public need sits behind; omit to put it on the front door
enters_as: <group> # ONLY for a role inside the business; omit for the public
lands_in: <bucket> # snake_case, ASCII
handled_by: <group> # the role that must see and move the record
stages: [open, <stage>, ..., <end>, <end>]
# EVERY stage the business said a case goes through, first to
# last, read off their own sentences one verb at a time: "they
# come in, we go and look, we send a quote, we win or lose it"
# is [open, surveyed, quoted, won, lost]. A pipeline is not an
# inbox: "answered" is rarely the real outcome.
done_when: [<end>, <end>] # every stage that counts as finished, good or bad
success: [<end>] # the finished stages that are a good outcome for the business
skippable: [<stage>] # stages a case may pass over (papers already complete)
moves_by: { <stage>: [<group>, ...] }
# only where someone other than handled_by moves a case INTO a
# stage: another group, or `submitter` (the person who sent the
# form; the form must then collect a required `email`)
watched_by: [<group>] # groups that see these cases and move nothing; `public` opens a
# read-only page of the bucket to everyone (contact details hidden)
mails: { open: submitter, <end>: submitter, <stage>: <address> }
# who hears when a case enters a stage: `submitter` (the form
# must then collect a required `email`) or one address. Tell the
# person on arrival and on every decision that is about them.
events: { open: applied } # ONLY when rebuilding a live site: the event names its
# aggregates.yaml already has, so its records keep replaying
attended_by: > # ONLY for a stage no desk button moves: the automation that does
what moves it, in a sentence
max_fields: 4 # how many required fields THIS person will tolerate, from what
# the intake says about them: someone on a phone with gloves
# on gets 3, a first enquiry 4 to 6, a firm's paperwork 5 to 6
collects: # the form; name is snake_case ASCII, type one of
# text (default), email, tel, textarea, date, select
- { name: name }
- { name: phone, type: tel }
- { name: problem, type: textarea }
- { name: urgency, type: select, options: [This week, This month, No rush] }
- { name: can_do, type: select, multiple: true, options: [Drive, Cook, Carry] } # any number
- { name: committee, type: select, options_from: groups } # the labelled groups above
- { name: address, optional: true, private: true } # never on a public page
```
Rules:
- One need per (kind of person, thing they want). Work inside the
business counts: a role recording or posting something is a need
with `enters_as`. The intake's "what slows us down" usually names one.
- Groups are the roles the intake names, as snake_case identifiers.
- The front door opens with `does` (at most two features, one role
each) and `shows`, then holds at most seven offers: doors plus needs
with no door. A door with no need behind it, or a door on a need with
`enters_as`, is refused. A role `does` speaks for must have a move
of its own after sending (`moves_by` with `submitter`) or a public
view, or it is a spectator.
- Every need whose form collects an email should tell the person on
arrival and on the decisions about them (`mails`); the plan then
needs `mail: { from }`.
- Needs that land in the same bucket must have the same stages,
done_when, skippable, moves_by, watched_by and handled_by.
- Every required field is one the business will use to act on the
record. If the intake gives no reason to need it, make it optional or
leave it out. The required fields must not exceed max_fields.
- Only `select` lists `options`, and it must list them.
- Everything a person reads (who, wants, about, select options) is in
the intake's language. Everything a machine reads (ids, buckets,
groups, stages, field names) is plain ASCII: no æ, ø, å.
- Write no personas.
# Task
A business filled in this intake. Write its plan.yaml: every need the intake implies, for the public and for each role inside the business, with the stages read off how the business says things progress, the form each need collects, and how much each person will tolerate.
## Intake
# An intake as the owner of a small building contractor would fill it
# in: plain words, no portal vocabulary. These are the fields the
# onboarding site asks for.
business: Nordvik Bygg
contact: { name: Ingrid Nordvik, email: ingrid@nordvikbygg.example }
language: en
what_we_do: >
We are twelve people. We survey old buildings, draw up rehabilitation
plans, handle the permit application, and do the building work with
our own carpenters plus subcontractors for electrical, plumbing and
scaffolding.
who_comes_to_us: >
Housing boards and private owners who have a problem with a building
and want someone to look at it. Owners who already know what they
want built and need drawings, a permit and a price. Trade firms who
want to be on our list of subcontractors. Carpenters and apprentices
asking if we are hiring.
what_we_keep_track_of: >
Enquiries: they come in, we go and look at the building, we send a
quote, and then we either win it or lose it. Sometimes it is simply
not for us and we say so straight away.
Subcontractors: they apply, we check their company registration,
trade approval and insurance. Often papers are missing and we have to
ask again. Then they are approved or turned down.
Job applications: we read them, invite some to an interview, and hire
or decline.
Things that go wrong on site: a hazard, a near miss, wrong materials
delivered. Someone reports it, the safety officer decides what is
done about it, and closes it when it is fixed.
who_is_involved: >
Two project managers handle enquiries, subcontractors and hiring.
One safety officer handles everything reported from site.
The crew, ours and the subcontractors' people, are the ones on site
who report things. They are on their phones, with gloves on, and
will not fill in a long form.
what_slows_us_down: >
Enquiries arrive by phone, email and text and get lost. We never know
which subcontractors have valid papers. Site problems get mentioned
at lunch and forgotten.
Reply with the YAML only, no prose, no code fences.
@@ -0,0 +1,104 @@
```yaml
business: Nordvik Bygg
language: en
contact: { name: Ingrid Nordvik, email: ingrid@nordvikbygg.example }
about: >
We survey old buildings, draw up rehabilitation plans, handle the permit
application, and do the building work with our own carpenters plus
subcontractors for electrical, plumbing and scaffolding.
mail: { from: "Nordvik Bygg <post@nordvikbygg.example>", reply_to: ingrid@nordvikbygg.example }
does:
- id: survey-and-quote
for: building-problem
text: We come and look at your building, draw up a plan and send you a quote.
- id: design-permit-build
for: known-project
text: We draw the plans, handle the permit application and build it.
needs:
- id: building-problem
who: A housing board or private owner with a problem with a building
wants: Someone to come and look at it, and tell them what it would cost to fix
lands_in: enquiries
handled_by: project_managers
stages: [open, surveyed, quoted, won, lost, declined]
done_when: [won, lost, declined]
success: [won]
skippable: [surveyed, quoted]
mails: { open: submitter, quoted: submitter, won: submitter, lost: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: phone, type: tel, optional: true }
- { name: address }
- { name: problem, type: textarea }
- id: known-project
who: An owner who already knows what they want built
wants: Drawings, a permit application and a price
lands_in: enquiries
handled_by: project_managers
stages: [open, surveyed, quoted, won, lost, declined]
done_when: [won, lost, declined]
success: [won]
skippable: [surveyed, quoted]
mails: { open: submitter, quoted: submitter, won: submitter, lost: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: address }
- { name: project, type: textarea }
- id: subcontractor-application
who: A trade firm that wants to be on our list of subcontractors
wants: To be approved as a subcontractor
lands_in: subcontractors
handled_by: project_managers
stages: [open, checking, papers_requested, approved, rejected]
done_when: [approved, rejected]
success: [approved]
skippable: [papers_requested]
mails: { open: submitter, papers_requested: submitter, approved: submitter, rejected: submitter }
max_fields: 5
collects:
- { name: company_name }
- { name: registration_number }
- { name: trade, type: select, options: [Electrical, Plumbing, Scaffolding, Other] }
- { name: insurance }
- { name: email, type: email }
- id: job-application
who: A carpenter or apprentice asking if we are hiring
wants: To apply for a job with us
lands_in: applications
handled_by: project_managers
stages: [open, interview, hired, declined]
done_when: [hired, declined]
success: [hired]
skippable: [interview]
mails: { open: submitter, interview: submitter, hired: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: role, type: select, options: [Carpenter, Apprentice] }
- { name: message, type: textarea }
- id: site-report
who: Crew on site, ours or a subcontractor's
wants: To report a hazard, near miss or wrong materials before it is forgotten
enters_as: crew
lands_in: site_reports
handled_by: safety_officer
stages: [open, closed]
done_when: [closed]
success: [closed]
max_fields: 3
collects:
- { name: type, type: select, options: [Hazard, Near miss, Wrong materials] }
- { name: description, type: textarea }
- { name: location, optional: true }
```
@@ -0,0 +1,660 @@
{
"needs": [
{
"id": "building-problem",
"who": "A housing board or private owner with a problem with a building",
"wants": "Someone to come and look at it, and tell them what it would cost to fix",
"enters_as": null,
"lands_in": "enquiries",
"handled_by": "project_managers",
"done_when": [
"won",
"lost",
"declined"
],
"success": [
"won"
],
"steps": [
{
"page": "/",
"question": "What do you need done?",
"context": "Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"options": [
{
"name": "Get someone out to look at it",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."
},
{
"name": "Get drawings, a permit and a price",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price."
},
{
"name": "Get on our list of subcontractors",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there."
},
{
"name": "Ask if we're hiring",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself."
}
],
"expect": [
"Get someone out to look at it"
],
"alternative": "Get someone out to look at it",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "phone",
"label": "Phone",
"type": "tel",
"optional": true,
"options": []
},
{
"name": "address",
"label": "Address",
"type": "text",
"optional": false,
"options": []
},
{
"name": "problem",
"label": "What's the problem?",
"type": "textarea",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "known-project",
"who": "An owner who already knows what they want built",
"wants": "Drawings, a permit application and a price",
"enters_as": null,
"lands_in": "enquiries",
"handled_by": "project_managers",
"done_when": [
"won",
"lost",
"declined"
],
"success": [
"won"
],
"steps": [
{
"page": "/",
"question": "What do you need done?",
"context": "Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"options": [
{
"name": "Get someone out to look at it",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."
},
{
"name": "Get drawings, a permit and a price",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price."
},
{
"name": "Get on our list of subcontractors",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there."
},
{
"name": "Ask if we're hiring",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself."
}
],
"expect": [
"Get drawings, a permit and a price"
],
"alternative": "Get drawings, a permit and a price",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "address",
"label": "Address",
"type": "text",
"optional": false,
"options": []
},
{
"name": "project",
"label": "What are you planning?",
"type": "textarea",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "subcontractor-application",
"who": "A trade firm that wants to be on our list of subcontractors",
"wants": "To be approved as a subcontractor",
"enters_as": null,
"lands_in": "subcontractors",
"handled_by": "project_managers",
"done_when": [
"approved",
"rejected"
],
"success": [
"approved"
],
"steps": [
{
"page": "/",
"question": "What do you need done?",
"context": "Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"options": [
{
"name": "Get someone out to look at it",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."
},
{
"name": "Get drawings, a permit and a price",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price."
},
{
"name": "Get on our list of subcontractors",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there."
},
{
"name": "Ask if we're hiring",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself."
}
],
"expect": [
"Get on our list of subcontractors"
],
"alternative": "Get on our list of subcontractors",
"fields": [
{
"name": "company_name",
"label": "Company name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "registration_number",
"label": "Registration number",
"type": "text",
"optional": false,
"options": []
},
{
"name": "trade",
"label": "Trade",
"type": "select",
"optional": false,
"options": [
"Electrical",
"Plumbing",
"Scaffolding",
"Other"
]
},
{
"name": "insurance",
"label": "Insurance in place?",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "job-application",
"who": "A carpenter or apprentice asking if we are hiring",
"wants": "To apply for a job with us",
"enters_as": null,
"lands_in": "applications",
"handled_by": "project_managers",
"done_when": [
"hired",
"declined"
],
"success": [
"hired"
],
"steps": [
{
"page": "/",
"question": "What do you need done?",
"context": "Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"options": [
{
"name": "Get someone out to look at it",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."
},
{
"name": "Get drawings, a permit and a price",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price."
},
{
"name": "Get on our list of subcontractors",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there."
},
{
"name": "Ask if we're hiring",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself."
}
],
"expect": [
"Ask if we're hiring"
],
"alternative": "Ask if we're hiring",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text",
"optional": false,
"options": []
},
{
"name": "email",
"label": "Email",
"type": "email",
"optional": false,
"options": []
},
{
"name": "role",
"label": "What kind of work?",
"type": "select",
"optional": false,
"options": [
"Carpenter",
"Apprentice"
]
},
{
"name": "message",
"label": "Tell us about yourself",
"type": "textarea",
"optional": false,
"options": []
}
]
}
]
},
{
"id": "site-report",
"who": "Crew on site, ours or a subcontractor's",
"wants": "To report a hazard, near miss or wrong materials before it is forgotten",
"enters_as": "crew",
"lands_in": "site_reports",
"handled_by": "safety_officer",
"done_when": [
"closed"
],
"success": [
"closed"
],
"steps": [
{
"page": "/crew/site-report",
"question": "Is something on this site unsafe or not right?",
"context": "",
"options": [
{
"name": "Flag a hazard on site",
"description": "See a hazard, near miss or wrong materials on site? Log it before it slips your mind."
}
],
"expect": [
"Flag a hazard on site"
],
"alternative": "Flag a hazard on site",
"fields": [
{
"name": "type",
"label": "What kind of issue",
"type": "select",
"optional": false,
"options": [
"Hazard",
"Near miss",
"Wrong materials"
]
},
{
"name": "description",
"label": "What's wrong",
"type": "textarea",
"optional": false,
"options": []
},
{
"name": "location",
"label": "Where on site",
"type": "text",
"optional": true,
"options": []
}
]
}
]
}
],
"buckets": {
"enquiries": {
"initial": "open",
"transitions": {
"open": [
"surveyed",
"quoted",
"won",
"lost",
"declined"
],
"quoted": [
"won",
"lost",
"declined"
],
"surveyed": [
"quoted",
"won",
"lost",
"declined"
]
},
"desks": [
{
"page": "/project_managers",
"group": "project_managers",
"moves": [
{
"from": "open",
"to": "surveyed",
"label": "Log the survey"
},
{
"from": "open",
"to": "quoted",
"label": "Send a price"
},
{
"from": "open",
"to": "won",
"label": "Mark as won"
},
{
"from": "open",
"to": "lost",
"label": "Mark as lost"
},
{
"from": "open",
"to": "declined",
"label": "Turn down"
},
{
"from": "quoted",
"to": "won",
"label": "Mark as won"
},
{
"from": "quoted",
"to": "lost",
"label": "Mark as lost"
},
{
"from": "quoted",
"to": "declined",
"label": "Turn down"
},
{
"from": "surveyed",
"to": "quoted",
"label": "Send a price"
},
{
"from": "surveyed",
"to": "won",
"label": "Mark as won"
},
{
"from": "surveyed",
"to": "lost",
"label": "Mark as lost"
},
{
"from": "surveyed",
"to": "declined",
"label": "Turn down"
}
]
}
],
"self_moves": []
},
"subcontractors": {
"initial": "open",
"transitions": {
"papers_requested": [
"approved",
"rejected"
],
"open": [
"checking",
"rejected"
],
"checking": [
"papers_requested",
"approved",
"rejected"
]
},
"desks": [
{
"page": "/project_managers",
"group": "project_managers",
"moves": [
{
"from": "checking",
"to": "papers_requested",
"label": "Ask for papers"
},
{
"from": "checking",
"to": "approved",
"label": "Approve them"
},
{
"from": "checking",
"to": "rejected",
"label": "Turn down"
},
{
"from": "open",
"to": "checking",
"label": "Start checking"
},
{
"from": "open",
"to": "rejected",
"label": "Turn down"
},
{
"from": "papers_requested",
"to": "approved",
"label": "Approve them"
},
{
"from": "papers_requested",
"to": "rejected",
"label": "Turn down"
}
]
}
],
"self_moves": []
},
"applications": {
"initial": "open",
"transitions": {
"interview": [
"hired",
"declined"
],
"open": [
"interview",
"hired",
"declined"
]
},
"desks": [
{
"page": "/project_managers",
"group": "project_managers",
"moves": [
{
"from": "interview",
"to": "hired",
"label": "Offer the job"
},
{
"from": "interview",
"to": "declined",
"label": "Not moving forward"
},
{
"from": "open",
"to": "interview",
"label": "Call in for interview"
},
{
"from": "open",
"to": "hired",
"label": "Hire straight away"
},
{
"from": "open",
"to": "declined",
"label": "Not a fit"
}
]
}
],
"self_moves": []
},
"site_reports": {
"initial": "open",
"transitions": {
"open": [
"closed"
]
},
"desks": [
{
"page": "/safety_officer",
"group": "safety_officer",
"moves": [
{
"from": "open",
"to": "closed",
"label": "Mark sorted"
}
]
}
],
"self_moves": []
}
},
"personas": [
{
"id": "housing-board-damp",
"need": "building-problem",
"text": "I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us."
},
{
"id": "buyer-before-purchase",
"need": "building-problem",
"text": "We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it."
},
{
"id": "attic-conversion",
"need": "known-project",
"text": "We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality."
},
{
"id": "shop-to-flat",
"need": "known-project",
"text": "I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?"
},
{
"id": "electrician-firm",
"need": "subcontractor-application",
"text": "We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians."
},
{
"id": "scaffolder",
"need": "subcontractor-application",
"text": "I run a scaffolding company. How do I get to do jobs for you?"
},
{
"id": "carpenter-jobseeker",
"need": "job-application",
"text": "I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?"
},
{
"id": "apprentice",
"need": "job-application",
"text": "I finish vocational school this spring and need an apprenticeship as a bricklayer."
},
{
"id": "loose-railing",
"need": "site-report",
"text": "The railing on the third level of the scaffold on the north side is loose. Nobody got hurt but someone will."
},
{
"id": "wrong-membrane",
"need": "site-report",
"text": "The bathroom membrane delivered today is not the one in the specification. We stopped work on it."
}
]
}
@@ -0,0 +1,145 @@
business: Nordvik Bygg
language: en
contact: { name: Ingrid Nordvik, email: ingrid@nordvikbygg.example }
about: >
We survey old buildings, draw up rehabilitation plans, handle the permit
application, and do the building work with our own carpenters plus
subcontractors for electrical, plumbing and scaffolding.
mail: { from: "Nordvik Bygg <post@nordvikbygg.example>", reply_to: ingrid@nordvikbygg.example }
does:
- id: survey-and-quote
for: building-problem
text: We come and look at your building, draw up a plan and send you a quote.
- id: design-permit-build
for: known-project
text: We draw the plans, handle the permit application and build it.
needs:
- id: building-problem
who: A housing board or private owner with a problem with a building
wants: Someone to come and look at it, and tell them what it would cost to fix
lands_in: enquiries
handled_by: project_managers
stages: [open, surveyed, quoted, won, lost, declined]
done_when: [won, lost, declined]
success: [won]
skippable: [surveyed, quoted]
mails: { open: submitter, quoted: submitter, won: submitter, lost: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: phone, type: tel, optional: true }
- { name: address }
- { name: problem, type: textarea }
- id: known-project
who: An owner who already knows what they want built
wants: Drawings, a permit application and a price
lands_in: enquiries
handled_by: project_managers
stages: [open, surveyed, quoted, won, lost, declined]
done_when: [won, lost, declined]
success: [won]
skippable: [surveyed, quoted]
mails: { open: submitter, quoted: submitter, won: submitter, lost: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: address }
- { name: project, type: textarea }
- id: subcontractor-application
who: A trade firm that wants to be on our list of subcontractors
wants: To be approved as a subcontractor
lands_in: subcontractors
handled_by: project_managers
stages: [open, checking, papers_requested, approved, rejected]
done_when: [approved, rejected]
success: [approved]
skippable: [papers_requested]
mails: { open: submitter, papers_requested: submitter, approved: submitter, rejected: submitter }
max_fields: 5
collects:
- { name: company_name }
- { name: registration_number }
- { name: trade, type: select, options: [Electrical, Plumbing, Scaffolding, Other] }
- { name: insurance }
- { name: email, type: email }
- id: job-application
who: A carpenter or apprentice asking if we are hiring
wants: To apply for a job with us
lands_in: applications
handled_by: project_managers
stages: [open, interview, hired, declined]
done_when: [hired, declined]
success: [hired]
skippable: [interview]
mails: { open: submitter, interview: submitter, hired: submitter, declined: submitter }
max_fields: 4
collects:
- { name: name }
- { name: email, type: email }
- { name: role, type: select, options: [Carpenter, Apprentice] }
- { name: message, type: textarea }
- id: site-report
who: Crew on site, ours or a subcontractor's
wants: To report a hazard, near miss or wrong materials before it is forgotten
enters_as: crew
lands_in: site_reports
handled_by: safety_officer
stages: [open, closed]
done_when: [closed]
success: [closed]
max_fields: 3
collects:
- { name: type, type: select, options: [Hazard, Near miss, Wrong materials] }
- { name: description, type: textarea }
- { name: location, optional: true }
# Held out from every model that writes words.
personas:
- id: housing-board-damp
need: building-problem
text: |
I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us.
- id: buyer-before-purchase
need: building-problem
text: |
We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it.
- id: attic-conversion
need: known-project
text: |
We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality.
- id: shop-to-flat
need: known-project
text: |
I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?
- id: electrician-firm
need: subcontractor-application
text: |
We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians.
- id: scaffolder
need: subcontractor-application
text: |
I run a scaffolding company. How do I get to do jobs for you?
- id: carpenter-jobseeker
need: job-application
text: |
I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?
- id: apprentice
need: job-application
text: |
I finish vocational school this spring and need an apprenticeship as a bricklayer.
- id: loose-railing
need: site-report
text: |
The railing on the third level of the scaffold on the north side is loose. Nobody got hurt but someone will.
- id: wrong-membrane
need: site-report
text: |
The bathroom membrane delivered today is not the one in the specification. We stopped work on it.
@@ -0,0 +1,137 @@
aggregates:
- bucket: applications
initial: open
states:
declined:
event: declined
mail:
body: Thanks for taking the time to apply. We've decided to go with other candidates this time, but we'll hang on to your details in case something suits down the line. Good luck out there.
subject: Your application with Nordvik Bygg
to: submitter
hired:
event: hired
mail:
body: Good news - we'd like to bring you on board. Ingrid will be in touch shortly to sort out start date and paperwork. Welcome to the crew.
subject: Welcome to Nordvik Bygg
to: submitter
interview:
event: interview
mail:
body: We'd like to meet you. Someone from our team will call you soon to find a time. Have a couple of past jobs ready to talk through.
subject: Let's talk - Nordvik Bygg
to: submitter
open:
event: received
mail:
body: Thanks for reaching out about work with us. We're looking through applications now and will get back to you soon either way.
subject: We've got your application
to: submitter
transitions:
interview:
- hired
- declined
open:
- interview
- hired
- declined
- bucket: enquiries
initial: open
states:
declined:
event: declined
mail:
body: We won't be able to take this one on. Sorry we can't help this time - feel free to come back to us if things change.
subject: About your enquiry
to: submitter
lost:
event: lost
mail:
body: You've gone with someone else for this job - no hard feelings. If anything else comes up on the building, give us a shout.
subject: About your quote
to: submitter
open:
event: received
mail:
body: We've received your enquiry and will be in touch to arrange a look at the building. No need to do anything else for now.
subject: We've got your enquiry
to: submitter
quoted:
event: quoted
mail:
body: Your quote is ready - see the details at {site}. Let us know if you'd like to go ahead or if anything needs explaining.
subject: Your quote from Nordvik Bygg
to: submitter
surveyed:
event: surveyed
won:
event: won
mail:
body: Great - you're in. We'll be in touch to plan dates and next steps for getting the work started.
subject: You're booked in with Nordvik Bygg
to: submitter
transitions:
open:
- surveyed
- quoted
- won
- lost
- declined
quoted:
- won
- lost
- declined
surveyed:
- quoted
- won
- lost
- declined
- bucket: site_reports
initial: open
states:
closed:
event: closed
open:
event: received
transitions:
open:
- closed
- bucket: subcontractors
initial: open
states:
approved:
event: approved
mail:
body: You're approved and now on our subcontractor list. We'll reach out when work comes up that suits you.
subject: You're on our subcontractor list
to: submitter
checking:
event: checking
open:
event: received
mail:
body: Thanks for applying to work with us. We're going through your details and will come back to you soon.
subject: We've got your application
to: submitter
papers_requested:
event: papers_requested
mail:
body: Before we can approve you, we need a few papers from you - see what's needed at {site}. Send them across when you can.
subject: We need a few documents from you
to: submitter
rejected:
event: rejected
mail:
body: We won't be adding you to our subcontractor list at this time. Thanks for your interest - you're welcome to apply again later.
subject: About your subcontractor application
to: submitter
transitions:
checking:
- papers_requested
- approved
- rejected
open:
- checking
- rejected
papers_requested:
- approved
- rejected
@@ -0,0 +1,152 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: aggregates.yaml
It is the mails the site sends. Under each bucket, each stage that sends one has a `subject` and a `body`: the mail a person gets the moment their case enters that stage, saying what happened and what, if anything, they can do now. Plain text, short, in the business's voice. Keep every `{...}` placeholder exactly as it is - `{site}`, `{chain}`, `{email}` and any field name are filled in by the site - and keep any line with a link in it.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"applications": {
"declined": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"hired": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"interview": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"open": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
}
},
"enquiries": {
"declined": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"lost": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"open": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"quoted": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"won": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
}
},
"subcontractors": {
"approved": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"open": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"papers_requested": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
},
"rejected": {
"body": "<WRITE: a form label for the field `body`>",
"subject": "<WRITE: a form label for the field `subject`>"
}
}
}
Reply with the JSON object only.
=== REPLY ===
{
"applications": {
"declined": {
"body": "Thanks for taking the time to apply. We've decided to go with other candidates this time, but we'll hang on to your details in case something suits down the line. Good luck out there.",
"subject": "Your application with Nordvik Bygg"
},
"hired": {
"body": "Good news - we'd like to bring you on board. Ingrid will be in touch shortly to sort out start date and paperwork. Welcome to the crew.",
"subject": "Welcome to Nordvik Bygg"
},
"interview": {
"body": "We'd like to meet you. Someone from our team will call you soon to find a time. Have a couple of past jobs ready to talk through.",
"subject": "Let's talk - Nordvik Bygg"
},
"open": {
"body": "Thanks for reaching out about work with us. We're looking through applications now and will get back to you soon either way.",
"subject": "We've got your application"
}
},
"enquiries": {
"declined": {
"body": "We won't be able to take this one on. Sorry we can't help this time - feel free to come back to us if things change.",
"subject": "About your enquiry"
},
"lost": {
"body": "You've gone with someone else for this job - no hard feelings. If anything else comes up on the building, give us a shout.",
"subject": "About your quote"
},
"open": {
"body": "We've received your enquiry and will be in touch to arrange a look at the building. No need to do anything else for now.",
"subject": "We've got your enquiry"
},
"quoted": {
"body": "Your quote is ready - see the details at {site}. Let us know if you'd like to go ahead or if anything needs explaining.",
"subject": "Your quote from Nordvik Bygg"
},
"won": {
"body": "Great - you're in. We'll be in touch to plan dates and next steps for getting the work started.",
"subject": "You're booked in with Nordvik Bygg"
}
},
"subcontractors": {
"approved": {
"body": "You're approved and now on our subcontractor list. We'll reach out when work comes up that suits you.",
"subject": "You're on our subcontractor list"
},
"open": {
"body": "Thanks for applying to work with us. We're going through your details and will come back to you soon.",
"subject": "We've got your application"
},
"papers_requested": {
"body": "Before we can approve you, we need a few papers from you - see what's needed at {site}. Send them across when you can.",
"subject": "We need a few documents from you"
},
"rejected": {
"body": "We won't be adding you to our subcontractor list at this time. Thanks for your interest - you're welcome to apply again later.",
"subject": "About your subcontractor application"
}
}
}
@@ -0,0 +1,94 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/crew/index.yaml
It is a desk: the page one role inside the business works from. Under `buckets`, each entry is a list of cases; `moves` are the buttons that move a case from one stage to the next (key `from->to`), so label each with what the person has just done. Under `links` are pages this role can open. Under `invites`, each entry is a form that invites a person into that group - they get an account and a one-time link - and `invited` is the list of invites sent.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"buckets": {},
"confirm": "<WRITE: the one button under every list on this desk, confirming a move the person has chosen; one word, such as Confirm>",
"description": "<WRITE: one or two short sentences>",
"invited": {
"description": "<WRITE: one or two short sentences>",
"done": "<WRITE: a form label for the field `done`>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>"
},
"invites": {
"crew": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"labels": {
"email": "<WRITE: a form label for the field `email`>",
"name": "<WRITE: a form label for the field `name`>"
}
}
},
"links": {
"site-report": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>"
}
},
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"buckets": {},
"confirm": "Confirm",
"description": "The desk for keeping on top of enquiries, quotes and crew as they move through the job.",
"invited": {
"description": "Everyone you've invited into the crew, and whether they've come on board yet.",
"done": "Joined",
"heading": "Who you've invited so far"
},
"invites": {
"crew": {
"button": "Send invite",
"description": "Bring another project manager onto the desk so they can see and work the same cases.",
"form_title": "Invite to the crew",
"heading": "Get a colleague working alongside you",
"labels": {
"email": "Their email",
"name": "Their name"
}
}
},
"links": {
"site-report": {
"button": "Open site reports",
"description": "See what's been flagged from site before it's forgotten - hazards, near misses, wrong materials.",
"heading": "See what the crew has flagged from site"
}
},
"question": "What needs your attention on the desk right now?"
}
```
@@ -0,0 +1,46 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/crew/site-report-sent.yaml
It is a page shown right after someone has sent a form. Say who reads it, when they answer, and what happens next.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"back": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"next_description": "<WRITE: one or two short sentences>",
"next_heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
{
"back": "Back to site",
"description": "Your report has gone straight to Ingrid, our safety officer. She reads these as they come in and follows up if it needs action.",
"next_description": "If it's urgent, she'll ring the site directly. Otherwise expect a note once she's looked into it.",
"next_heading": "Ingrid follows up if needed",
"question": "What happens to my report now?"
}
@@ -0,0 +1,88 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/crew/site-report.yaml
It is a page only one role inside the business can open, holding one form.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"hints": {
"description": "<WRITE: one or two short sentences>",
"location": "<WRITE: an example answer for the field `location`, as a placeholder; or empty>",
"type": "<WRITE: an example answer for the field `type`, as a placeholder; or empty>"
},
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"labels": {
"description": "<WRITE: one or two short sentences>",
"location": "<WRITE: a form label for the field `location`>",
"type": "<WRITE: a form label for the field `type`>"
},
"page_description": "<WRITE: one or two short sentences>",
"question": "<WRITE: the one question this page asks its reader>",
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"button": "Report it now",
"description": "See a hazard, near miss or wrong materials on site? Log it before it slips your mind.",
"encouragement": "Takes under a minute. Ingrid's team acts on it straight away.",
"form_description": "Just say where and what's wrong, we'll take it from there.",
"form_title": "Report from site",
"heading": "Flag a hazard on site",
"hints": {
"description": "Scaffolding missing a guardrail on the north side, second floor.",
"location": "North side, 2nd floor scaffolding",
"type": "Hazard"
},
"icon": "alert-triangle",
"labels": {
"description": "What's wrong",
"location": "Where on site",
"type": "What kind of issue"
},
"page_description": "Spotted something unsafe, a near miss, or the wrong materials on site? Report it here before it's forgotten.",
"question": "Is something on this site unsafe or not right?",
"road_description": "Your report goes straight to the safety officer, who looks into it and closes it out once it's sorted.",
"road_icon": "check-circle",
"road_title": "What happens next",
"who_description": "The safety officer reads every report and follows up directly, call Ingrid Nordvik on ingrid@nordvikbygg.example if it can't wait.",
"who_icon": "shield",
"who_title": "Who sees this"
}
```
@@ -0,0 +1,314 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/index.yaml
It is the front door: the first page any visitor sees. `question` is the page's one question. It opens modestly: `opener` is the first card, what the business does in several features and no button at all - a stranger reads it and decides whether to trust the place, so say what is true and useful, not what to press. `shopping` is the second card, things a visitor may look at before asking for anything. Only then come the offers: under `doors`, each entry is one alternative that leads to a page of its own for one kind of visitor, and its heading must let that visitor recognise themselves from the heading alone; under `needs`, each entry is one alternative with a form behind it.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"description": "<WRITE: one or two short sentences>",
"doors": {},
"needs": {
"building-problem": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"hints": {
"address": "<WRITE: an example answer for the field `address`, as a placeholder; or empty>",
"email": "<WRITE: an example answer for the field `email`, as a placeholder; or empty>",
"name": "<WRITE: an example answer for the field `name`, as a placeholder; or empty>",
"phone": "<WRITE: an example answer for the field `phone`, as a placeholder; or empty>",
"problem": "<WRITE: an example answer for the field `problem`, as a placeholder; or empty>"
},
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"labels": {
"address": "<WRITE: a form label for the field `address`>",
"email": "<WRITE: a form label for the field `email`>",
"name": "<WRITE: a form label for the field `name`>",
"phone": "<WRITE: a form label for the field `phone`>",
"problem": "<WRITE: a form label for the field `problem`>"
},
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>"
},
"job-application": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"hints": {
"email": "<WRITE: an example answer for the field `email`, as a placeholder; or empty>",
"message": "<WRITE: an example answer for the field `message`, as a placeholder; or empty>",
"name": "<WRITE: an example answer for the field `name`, as a placeholder; or empty>",
"role": "<WRITE: an example answer for the field `role`, as a placeholder; or empty>"
},
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"labels": {
"email": "<WRITE: a form label for the field `email`>",
"message": "<WRITE: a form label for the field `message`>",
"name": "<WRITE: a form label for the field `name`>",
"role": "<WRITE: a form label for the field `role`>"
},
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>"
},
"known-project": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"hints": {
"address": "<WRITE: an example answer for the field `address`, as a placeholder; or empty>",
"email": "<WRITE: an example answer for the field `email`, as a placeholder; or empty>",
"name": "<WRITE: an example answer for the field `name`, as a placeholder; or empty>",
"project": "<WRITE: an example answer for the field `project`, as a placeholder; or empty>"
},
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"labels": {
"address": "<WRITE: a form label for the field `address`>",
"email": "<WRITE: a form label for the field `email`>",
"name": "<WRITE: a form label for the field `name`>",
"project": "<WRITE: a form label for the field `project`>"
},
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>"
},
"subcontractor-application": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"encouragement": "<WRITE: one reassuring sentence: what happens with what they send, or how little it takes; or empty>",
"form_description": "<WRITE: one short line of guidance above the form, or empty>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"hints": {
"company_name": "<WRITE: an example answer for the field `company_name`, as a placeholder; or empty>",
"email": "<WRITE: an example answer for the field `email`, as a placeholder; or empty>",
"insurance": "<WRITE: an example answer for the field `insurance`, as a placeholder; or empty>",
"registration_number": "<WRITE: an example answer for the field `registration_number`, as a placeholder; or empty>",
"trade": "<WRITE: an example answer for the field `trade`, as a placeholder; or empty>"
},
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>",
"labels": {
"company_name": "<WRITE: a form label for the field `company_name`>",
"email": "<WRITE: a form label for the field `email`>",
"insurance": "<WRITE: a form label for the field `insurance`>",
"registration_number": "<WRITE: a form label for the field `registration_number`>",
"trade": "<WRITE: a form label for the field `trade`>"
},
"road_description": "<WRITE: one or two sentences walking the reader through the stages this goes through, in order (the stages are listed above), in their words>",
"road_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"road_title": "<WRITE: a short title, two to four words, for the line that says what happens after sending>",
"who_description": "<WRITE: one sentence: who reads what they send, and how to reach them meanwhile>",
"who_icon": "<WRITE: an icon name from the list at the end that fits this section; or empty>",
"who_title": "<WRITE: a short title, two to four words, for the line that says who reads it>"
}
},
"opener": {
"description": "<WRITE: one or two short sentences>",
"features": {
"design-permit-build": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
},
"survey-and-quote": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"icon": "<WRITE: an icon name from the list at the end, the one that fits this best; or empty>"
}
},
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>"
},
"question": "<WRITE: the one question this page asks its reader>",
"shopping": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"items": {}
}
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"description": "We survey the building, tell you what it needs and what it costs, get the permit sorted, and do the work ourselves with carpenters and trusted subcontractors.",
"doors": {},
"needs": {
"building-problem": {
"button": "Send it in",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs.",
"encouragement": "A few lines and a phone number is all we need to get started.",
"form_description": "The more you can tell us about what you're seeing, the better we can prepare before we come out.",
"form_title": "Tell us about it",
"heading": "Get someone out to look at it",
"hints": {
"address": "Storgata 14, 0155 Oslo",
"email": "you@example.com",
"name": "Kari Hansen",
"phone": "+47 900 00 000",
"problem": "Damp patch spreading across the ceiling in the stairwell"
},
"icon": "search",
"labels": {
"address": "Address",
"email": "Email",
"name": "Name",
"phone": "Phone",
"problem": "What's the problem?"
},
"road_description": "We come out and survey the building, then send you a quote. If you go ahead with us, the work is booked in; if not, no hard feelings.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and gets back to you; call us in the meantime if it's urgent.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"known-project": {
"button": "Get a quote",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price.",
"encouragement": "Send what you've got, even a rough sketch or a few notes is enough to start with.",
"form_description": "Tell us what you're planning and where, and we'll take it from there.",
"form_title": "Tell us your plans",
"heading": "Get drawings, a permit and a price",
"hints": {
"address": "Bakkegata 7, 0650 Oslo",
"email": "you@example.com",
"name": "Ola Berg",
"project": "Loft conversion, two new bedrooms and a bathroom"
},
"icon": "ruler",
"labels": {
"address": "Address",
"email": "Email",
"name": "Name",
"project": "What are you planning?"
},
"road_description": "We survey the site, then send you a quote covering drawings, permit and build. Say yes and we get to work; say no and that's fine too.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and gets back to you; call us in the meantime if you'd rather talk it through.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"subcontractor-application": {
"button": "Apply",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.",
"encouragement": "Have your registration number and insurance handy, that's really all we need to get started.",
"form_description": "We'll check your papers and get back to you.",
"form_title": "Tell us about your firm",
"heading": "Get on our list of subcontractors",
"hints": {
"company_name": "Berg Elektro AS",
"email": "post@example.com",
"insurance": "Yes, valid through 2027",
"registration_number": "NO 123 456 789",
"trade": "Electrical"
},
"icon": "handshake",
"labels": {
"company_name": "Company name",
"email": "Email",
"insurance": "Insurance in place?",
"registration_number": "Registration number",
"trade": "Trade"
},
"road_description": "We check your papers, may ask for more documents, and let you know if you're approved.",
"road_icon": "clipboard-list",
"road_title": "What happens next",
"who_description": "A project manager reviews your application; feel free to call if you have questions while you wait.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"job-application": {
"button": "Apply",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.",
"encouragement": "No need for a full CV to start, just tell us who you are and what you do.",
"form_description": "A few lines about your experience is a good start.",
"form_title": "Tell us about yourself",
"heading": "Ask if we're hiring",
"hints": {
"email": "you@example.com",
"message": "Trained carpenter, three years on renovation jobs",
"name": "Erik Solheim",
"role": "Carpenter"
},
"icon": "hammer",
"labels": {
"email": "Email",
"message": "Tell us about yourself",
"name": "Name",
"role": "What kind of work?"
},
"road_description": "We read what you send, invite you in for a chat if it looks like a fit, and let you know either way.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and reaches out if there's a fit.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
}
},
"opener": {
"description": "We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint.",
"features": {
"survey-and-quote": {
"description": "We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"heading": "Know what it needs and what it costs",
"icon": "search"
},
"design-permit-build": {
"description": "Drawings, the permit application, and the building work, all handled by us and the trades we trust.",
"heading": "One team from drawings to finished build",
"icon": "hammer"
}
},
"heading": "Old buildings, put right by people who know them"
},
"question": "What do you need done?",
"shopping": {
"description": "Not ready to reach out yet? Have a look around first.",
"heading": "See how we work",
"items": {}
}
}
```
@@ -0,0 +1,168 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/project_managers/index.yaml
It is a desk: the page one role inside the business works from. Under `buckets`, each entry is a list of cases; `moves` are the buttons that move a case from one stage to the next (key `from->to`), so label each with what the person has just done. Under `links` are pages this role can open. Under `invites`, each entry is a form that invites a person into that group - they get an account and a one-time link - and `invited` is the list of invites sent.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"buckets": {
"applications": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"moves": {
"interview->declined": "<WRITE: a button, two to four words, for a case going interview->declined>",
"interview->hired": "<WRITE: a button, two to four words, for a case going interview->hired>",
"open->declined": "<WRITE: a button, two to four words, for a case going open->declined>",
"open->hired": "<WRITE: a button, two to four words, for a case going open->hired>",
"open->interview": "<WRITE: a button, two to four words, for a case going open->interview>"
}
},
"enquiries": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"moves": {
"open->declined": "<WRITE: a button, two to four words, for a case going open->declined>",
"open->lost": "<WRITE: a button, two to four words, for a case going open->lost>",
"open->quoted": "<WRITE: a button, two to four words, for a case going open->quoted>",
"open->surveyed": "<WRITE: a button, two to four words, for a case going open->surveyed>",
"open->won": "<WRITE: a button, two to four words, for a case going open->won>",
"quoted->declined": "<WRITE: a button, two to four words, for a case going quoted->declined>",
"quoted->lost": "<WRITE: a button, two to four words, for a case going quoted->lost>",
"quoted->won": "<WRITE: a button, two to four words, for a case going quoted->won>",
"surveyed->declined": "<WRITE: a button, two to four words, for a case going surveyed->declined>",
"surveyed->lost": "<WRITE: a button, two to four words, for a case going surveyed->lost>",
"surveyed->quoted": "<WRITE: a button, two to four words, for a case going surveyed->quoted>",
"surveyed->won": "<WRITE: a button, two to four words, for a case going surveyed->won>"
}
},
"subcontractors": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"moves": {
"checking->approved": "<WRITE: a button, two to four words, for a case going checking->approved>",
"checking->papers_requested": "<WRITE: a button, two to four words, for a case going checking->papers_requested>",
"checking->rejected": "<WRITE: a button, two to four words, for a case going checking->rejected>",
"open->checking": "<WRITE: a button, two to four words, for a case going open->checking>",
"open->rejected": "<WRITE: a button, two to four words, for a case going open->rejected>",
"papers_requested->approved": "<WRITE: a button, two to four words, for a case going papers_requested->approved>",
"papers_requested->rejected": "<WRITE: a button, two to four words, for a case going papers_requested->rejected>"
}
}
},
"confirm": "<WRITE: the one button under every list on this desk, confirming a move the person has chosen; one word, such as Confirm>",
"description": "<WRITE: one or two short sentences>",
"invited": {
"description": "<WRITE: one or two short sentences>",
"done": "<WRITE: a form label for the field `done`>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>"
},
"invites": {
"project_managers": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"labels": {
"email": "<WRITE: a form label for the field `email`>",
"name": "<WRITE: a form label for the field `name`>"
}
}
},
"links": {},
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"buckets": {
"applications": {
"description": "People asking if we're hiring, from first message through to an offer.",
"heading": "People who want to work here",
"moves": {
"interview->declined": "Not moving forward",
"interview->hired": "Offer the job",
"open->declined": "Not a fit",
"open->hired": "Hire straight away",
"open->interview": "Call in for interview"
}
},
"enquiries": {
"description": "Everyone who's come to us with a building to fix or a project to build, from first contact to a decision.",
"heading": "Building work people want done",
"moves": {
"open->declined": "Turn down",
"open->lost": "Mark as lost",
"open->quoted": "Send a price",
"open->surveyed": "Log the survey",
"open->won": "Mark as won",
"quoted->declined": "Turn down",
"quoted->lost": "Mark as lost",
"quoted->won": "Mark as won",
"surveyed->declined": "Turn down",
"surveyed->lost": "Mark as lost",
"surveyed->quoted": "Send a price",
"surveyed->won": "Mark as won"
}
},
"subcontractors": {
"description": "Trade firms asking to be on our list, from first application to a decision.",
"heading": "Firms wanting to work with us",
"moves": {
"checking->approved": "Approve them",
"checking->papers_requested": "Ask for papers",
"checking->rejected": "Turn down",
"open->checking": "Start checking",
"open->rejected": "Turn down",
"papers_requested->approved": "Approve them",
"papers_requested->rejected": "Turn down"
}
}
},
"confirm": "Confirm",
"description": "Your desk for building enquiries, subcontractor applications and job applications, all in one place.",
"invited": {
"description": "Project managers you've invited who haven't signed in yet.",
"done": "Signed in",
"heading": "Invites sent, waiting on a reply"
},
"invites": {
"project_managers": {
"button": "Send invite",
"description": "Bring another project manager onto this desk with a one-time link.",
"form_title": "Invite a project manager",
"heading": "Add another project manager",
"labels": {
"email": "Email address",
"name": "Name"
}
}
},
"links": {},
"question": "What needs my attention today?"
}
```
@@ -0,0 +1,48 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/received/building-problem.yaml
It is a page shown right after someone has sent a form. Say who reads it, when they answer, and what happens next.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"back": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"next_description": "<WRITE: one or two short sentences>",
"next_heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"back": "Back to home",
"description": "Thanks for telling us about the building. We've received your report and logged it.",
"next_description": "One of our project managers will look over what you've sent and get in touch to arrange a site visit, usually within a few working days.",
"next_heading": "A project manager will call you",
"question": "What happens now that we've sent our building problem in?"
}
```
@@ -0,0 +1,48 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/received/job-application.yaml
It is a page shown right after someone has sent a form. Say who reads it, when they answer, and what happens next.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"back": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"next_description": "<WRITE: one or two short sentences>",
"next_heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"back": "Back to home",
"description": "Thanks for sending your application. Ingrid will have a look and get back to you.",
"next_description": "Ingrid goes through applications a few times a week and calls if there's a fit.",
"next_heading": "Ingrid reviews your application",
"question": "What happens to my application now?"
}
```
@@ -0,0 +1,46 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/received/known-project.yaml
It is a page shown right after someone has sent a form. Say who reads it, when they answer, and what happens next.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"back": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"next_description": "<WRITE: one or two short sentences>",
"next_heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
{
"back": "Back to home",
"description": "Thanks for sending over your plans. Ingrid will look them over and get back to you with next steps.",
"next_description": "We'll check what you've sent, work out the drawings, permit and price, and be in touch within a couple of days.",
"next_heading": "We'll price up your build",
"question": "What happens now that I've sent this in?"
}
@@ -0,0 +1,48 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/received/subcontractor-application.yaml
It is a page shown right after someone has sent a form. Say who reads it, when they answer, and what happens next.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"back": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"next_description": "<WRITE: one or two short sentences>",
"next_heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"back": "Back to home",
"description": "Thanks for applying to join our subcontractor list. We'll go through your papers and get back to you.",
"next_description": "We check your certificates and insurance, then let you know if we need anything else before you're on the list.",
"next_heading": "We review your application",
"question": "What happens now that we've sent this in?"
}
```
@@ -0,0 +1,98 @@
You write the words for one page of a website for this business.
Business: Nordvik Bygg
About: We survey old buildings, draw up rehabilitation plans, handle the permit application, and do the building work with our own carpenters plus subcontractors for electrical, plumbing and scaffolding.
Contact: Ingrid Nordvik <ingrid@nordvikbygg.example>
Language to write in: en
Everyone the site serves:
- building-problem: A housing board or private owner with a problem with a building - wants: Someone to come and look at it, and tell them what it would cost to fix. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- known-project: An owner who already knows what they want built - wants: Drawings, a permit application and a price. Handled by project_managers. Stages: open -> surveyed -> quoted -> won -> lost -> declined.
- subcontractor-application: A trade firm that wants to be on our list of subcontractors - wants: To be approved as a subcontractor. Handled by project_managers. Stages: open -> checking -> papers_requested -> approved -> rejected.
- job-application: A carpenter or apprentice asking if we are hiring - wants: To apply for a job with us. Handled by project_managers. Stages: open -> interview -> hired -> declined.
- site-report: Crew on site, ours or a subcontractor's - wants: To report a hazard, near miss or wrong materials before it is forgotten. Handled by safety_officer. Stages: open -> closed.
The page: questions/safety_officer/index.yaml
It is a desk: the page one role inside the business works from. Under `buckets`, each entry is a list of cases; `moves` are the buttons that move a case from one stage to the next (key `from->to`), so label each with what the person has just done. Under `links` are pages this role can open. Under `invites`, each entry is a form that invites a person into that group - they get an account and a one-time link - and `invited` is the list of invites sent.
Below is the page as JSON. Every value is a slot that says what to write there. Return the same JSON with every slot replaced by your words. Keep every key exactly as it is. A slot left as it is counts as no answer.
Rules for the words:
- `question` is a question the reader could ask themselves.
- A heading says what the reader gets, in the reader's own words, and must work without its description.
- Lead with what a thing enables. No negations in headings. No trade jargon the reader would not use.
- Descriptions are one or two short sentences. Labels and buttons are a few words.
- The button says what pressing it does; the encouragement says what happens next or how little it takes; the form's guidance line says what to have ready. Placeholders are example answers in the reader's words.
- An icon is one name from this list, chosen for what the reader is doing, or empty: house, building-2, store, school, map-pin, route, footprints, trees, leaf, snowflake, sun, users, user, user-plus, user-check, baby, heart-handshake, hand-helping, handshake, smile, mail, phone, message-circle, megaphone, bell, send, inbox, alert-triangle, siren, shield, construction, hammer, wrench, ruler, package, truck, car, bus, train-front, bike, calendar, clock, file-text, clipboard-list, receipt, wallet, coins, banknote, credit-card, key, lock, search, star, gift, shopping-cart, lightbulb, flag, thumbs-up, check-circle, briefcase, stethoscope, activity, camera, pencil, refresh-cw, list, layers, vote, scale
- Write the way people in this trade and country actually speak.
{
"buckets": {
"site_reports": {
"description": "<WRITE: one or two short sentences>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"moves": {
"open->closed": "<WRITE: a button, two to four words, for a case going open->closed>"
}
}
},
"confirm": "<WRITE: the one button under every list on this desk, confirming a move the person has chosen; one word, such as Confirm>",
"description": "<WRITE: one or two short sentences>",
"invited": {
"description": "<WRITE: one or two short sentences>",
"done": "<WRITE: a form label for the field `done`>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>"
},
"invites": {
"safety_officer": {
"button": "<WRITE: a button, one to three words, saying what pressing it does>",
"description": "<WRITE: one or two short sentences>",
"form_title": "<WRITE: a title for the form, two to four words>",
"heading": "<WRITE: a heading, at most eight words, saying what the reader gets>",
"labels": {
"email": "<WRITE: a form label for the field `email`>",
"name": "<WRITE: a form label for the field `name`>"
}
}
},
"links": {},
"question": "<WRITE: the one question this page asks its reader>"
}
Reply with the JSON object only.
=== REPLY ===
```json
{
"buckets": {
"site_reports": {
"description": "Hazards, near misses and wrong materials reported from site, ours or a subcontractor's.",
"heading": "What's been flagged from site",
"moves": {
"open->closed": "Mark sorted"
}
}
},
"confirm": "Confirm",
"description": "Reports coming in from site, so nothing gets forgotten before it becomes a problem.",
"invited": {
"description": "Safety officers you've invited, and whether they've taken up the invite yet.",
"done": "Signed up",
"heading": "Who you've invited so far"
},
"invites": {
"safety_officer": {
"button": "Send invite",
"description": "Give another safety officer their own login so they can see and close reports too.",
"form_title": "Invite a safety officer",
"heading": "Bring in another safety officer",
"labels": {
"email": "Their email",
"name": "Their name"
}
}
},
"links": {},
"question": "What's come in from site that needs sorting?"
}
```
@@ -0,0 +1,142 @@
needs:
- done_when:
- won
- lost
- declined
enters: /
handled_by: project_managers
id: building-problem
lands_in: enquiries
max_fields: 4
max_steps: 1
stages:
- open
- surveyed
- quoted
- won
- lost
- declined
success:
- won
via: Get someone out to look at it
wants: Someone to come and look at it, and tell them what it would cost to fix
who: A housing board or private owner with a problem with a building
- done_when:
- won
- lost
- declined
enters: /
handled_by: project_managers
id: known-project
lands_in: enquiries
max_fields: 4
max_steps: 1
stages:
- open
- surveyed
- quoted
- won
- lost
- declined
success:
- won
via: Get drawings, a permit and a price
wants: Drawings, a permit application and a price
who: An owner who already knows what they want built
- done_when:
- approved
- rejected
enters: /
handled_by: project_managers
id: subcontractor-application
lands_in: subcontractors
max_fields: 5
max_steps: 1
stages:
- open
- checking
- papers_requested
- approved
- rejected
success:
- approved
via: Get on our list of subcontractors
wants: To be approved as a subcontractor
who: A trade firm that wants to be on our list of subcontractors
- done_when:
- hired
- declined
enters: /
handled_by: project_managers
id: job-application
lands_in: applications
max_fields: 4
max_steps: 1
stages:
- open
- interview
- hired
- declined
success:
- hired
via: Ask if we're hiring
wants: To apply for a job with us
who: A carpenter or apprentice asking if we are hiring
- done_when:
- closed
enters: /crew/site-report
enters_as: crew
handled_by: safety_officer
id: site-report
lands_in: site_reports
max_fields: 3
max_steps: 1
stages:
- open
- closed
success:
- closed
via: Flag a hazard on site
wants: To report a hazard, near miss or wrong materials before it is forgotten
who: Crew on site, ours or a subcontractor's
personas:
- id: housing-board-damp
need: building-problem
text: |
I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us.
- id: buyer-before-purchase
need: building-problem
text: |
We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it.
- id: attic-conversion
need: known-project
text: |
We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality.
- id: shop-to-flat
need: known-project
text: |
I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?
- id: electrician-firm
need: subcontractor-application
text: |
We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians.
- id: scaffolder
need: subcontractor-application
text: |
I run a scaffolding company. How do I get to do jobs for you?
- id: carpenter-jobseeker
need: job-application
text: |
I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?
- id: apprentice
need: job-application
text: |
I finish vocational school this spring and need an apprenticeship as a bricklayer.
- id: loose-railing
need: site-report
text: |
The railing on the third level of the scaffold on the north side is loose. Nobody got hurt but someone will.
- id: wrong-membrane
need: site-report
text: |
The bathroom membrane delivered today is not the one in the specification. We stopped work on it.
@@ -0,0 +1 @@
qualifies: crew
@@ -0,0 +1,44 @@
alternatives:
- action: /crew/site-report
consequence:
- Open site reports
description: See what's been flagged from site before it's forgotten - hazards, near misses, wrong materials.
name: See what the crew has flagged from site
- action: /crew
consequence:
- Send invite
description: Bring another project manager onto the desk so they can see and work the same cases.
features:
- description: ''
name: Invite to the crew
requirements:
- label: Their name
name: name
- label: Their email
name: email
type: email
invite:
group: crew
name: Get a colleague working alongside you
- action: /crew
consequence:
- Confirm
description: Everyone you've invited into the crew, and whether they've come on board yet.
features:
- description: ''
name: ''
resource:
requires_group: crew
source:
bucket: portal_invites
kind: kv
transitions:
- from: open
label: Joined
to: done
name: Who you've invited so far
description: The desk for keeping on top of enquiries, quotes and crew as they move through the job.
name: What needs your attention on the desk right now?
responsible:
contact: ingrid@nordvikbygg.example
name: Ingrid Nordvik
@@ -0,0 +1,10 @@
alternatives:
- description: If it's urgent, she'll ring the site directly. Otherwise expect a note once she's looked into it.
name: Ingrid follows up if needed
- action: /crew
consequence:
- Back to site
description: ''
name: Back to site
description: Your report has gone straight to Ingrid, our safety officer. She reads these as they come in and follows up if it needs action.
name: What happens to my report now?
@@ -0,0 +1,42 @@
alternatives:
- action: /crew/site-report-sent
consequence:
- Report it now
description: See a hazard, near miss or wrong materials on site? Log it before it slips your mind.
encouragements:
- Takes under a minute. Ingrid's team acts on it straight away.
features:
- description: Your report goes straight to the safety officer, who looks into it and closes it out once it's sorted.
icon: lucide:check-circle
name: What happens next
- description: The safety officer reads every report and follows up directly, call Ingrid Nordvik on ingrid@nordvikbygg.example if it can't wait.
icon: lucide:shield
name: Who sees this
- description: Just say where and what's wrong, we'll take it from there.
icon: lucide:alert-triangle
name: Report from site
requirements:
- label: What kind of issue
name: type
options:
- Hazard
- Near miss
- Wrong materials
type: select
- label: What's wrong
name: description
placeholder: Scaffolding missing a guardrail on the north side, second floor.
type: textarea
- label: Where on site
name: location
optional: true
placeholder: North side, 2nd floor scaffolding
type: text
name: Flag a hazard on site
record_as: site_reports
description: Spotted something unsafe, a near miss, or the wrong materials on site? Report it here before it's forgotten.
followup: false
name: Is something on this site unsafe or not right?
responsible:
contact: ingrid@nordvikbygg.example
name: Ingrid Nordvik
@@ -0,0 +1,170 @@
alternatives:
- description: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint.
features:
- description: Drawings, the permit application, and the building work, all handled by us and the trades we trust.
icon: lucide:hammer
name: One team from drawings to finished build
- description: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.
icon: lucide:search
name: Know what it needs and what it costs
name: Old buildings, put right by people who know them
- action: /received/building-problem
consequence:
- Send it in
description: Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs.
encouragements:
- A few lines and a phone number is all we need to get started.
features:
- description: We come out and survey the building, then send you a quote. If you go ahead with us, the work is booked in; if not, no hard feelings.
icon: lucide:route
name: What happens next
- description: A project manager reads this and gets back to you; call us in the meantime if it's urgent.
icon: lucide:user-check
name: Who you'll hear from
- description: The more you can tell us about what you're seeing, the better we can prepare before we come out.
icon: lucide:search
name: Tell us about it
requirements:
- label: Name
name: name
placeholder: Kari Hansen
type: text
- label: Email
name: email
placeholder: you@example.com
type: email
- label: Phone
name: phone
optional: true
placeholder: +47 900 00 000
type: tel
- label: Address
name: address
placeholder: Storgata 14, 0155 Oslo
type: text
- label: What's the problem?
name: problem
placeholder: Damp patch spreading across the ceiling in the stairwell
type: textarea
name: Get someone out to look at it
record_as: enquiries
- action: /received/known-project
consequence:
- Get a quote
description: You know what you want built. We'll draw it up, handle the permit application, and give you a price.
encouragements:
- Send what you've got, even a rough sketch or a few notes is enough to start with.
features:
- description: We survey the site, then send you a quote covering drawings, permit and build. Say yes and we get to work; say no and that's fine too.
icon: lucide:route
name: What happens next
- description: A project manager reads this and gets back to you; call us in the meantime if you'd rather talk it through.
icon: lucide:user-check
name: Who you'll hear from
- description: Tell us what you're planning and where, and we'll take it from there.
icon: lucide:ruler
name: Tell us your plans
requirements:
- label: Name
name: name
placeholder: Ola Berg
type: text
- label: Email
name: email
placeholder: you@example.com
type: email
- label: Address
name: address
placeholder: Bakkegata 7, 0650 Oslo
type: text
- label: What are you planning?
name: project
placeholder: Loft conversion, two new bedrooms and a bathroom
type: textarea
name: Get drawings, a permit and a price
record_as: enquiries
- action: /received/subcontractor-application
consequence:
- Apply
description: Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.
encouragements:
- Have your registration number and insurance handy, that's really all we need to get started.
features:
- description: We check your papers, may ask for more documents, and let you know if you're approved.
icon: lucide:clipboard-list
name: What happens next
- description: A project manager reviews your application; feel free to call if you have questions while you wait.
icon: lucide:user-check
name: Who you'll hear from
- description: We'll check your papers and get back to you.
icon: lucide:handshake
name: Tell us about your firm
requirements:
- label: Company name
name: company_name
placeholder: Berg Elektro AS
type: text
- label: Registration number
name: registration_number
placeholder: NO 123 456 789
type: text
- label: Trade
name: trade
options:
- Electrical
- Plumbing
- Scaffolding
- Other
type: select
- label: Insurance in place?
name: insurance
placeholder: Yes, valid through 2027
type: text
- label: Email
name: email
placeholder: post@example.com
type: email
name: Get on our list of subcontractors
record_as: subcontractors
- action: /received/job-application
consequence:
- Apply
description: Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.
encouragements:
- No need for a full CV to start, just tell us who you are and what you do.
features:
- description: We read what you send, invite you in for a chat if it looks like a fit, and let you know either way.
icon: lucide:route
name: What happens next
- description: A project manager reads this and reaches out if there's a fit.
icon: lucide:user-check
name: Who you'll hear from
- description: A few lines about your experience is a good start.
icon: lucide:hammer
name: Tell us about yourself
requirements:
- label: Name
name: name
placeholder: Erik Solheim
type: text
- label: Email
name: email
placeholder: you@example.com
type: email
- label: What kind of work?
name: role
options:
- Carpenter
- Apprentice
type: select
- label: Tell us about yourself
name: message
placeholder: Trained carpenter, three years on renovation jobs
type: textarea
name: Ask if we're hiring
record_as: applications
description: We survey the building, tell you what it needs and what it costs, get the permit sorted, and do the work ourselves with carpenters and trusted subcontractors.
name: What do you need done?
responsible:
contact: ingrid@nordvikbygg.example
name: Ingrid Nordvik
@@ -0,0 +1 @@
qualifies: project_managers
@@ -0,0 +1,153 @@
alternatives:
- action: /project_managers
consequence:
- Confirm
description: People asking if we're hiring, from first message through to an offer.
features:
- description: ''
name: ''
resource:
requires_group: project_managers
source:
bucket: applications
kind: kv
transitions:
- from: interview
label: Offer the job
to: hired
- from: interview
label: Not moving forward
to: declined
- from: open
label: Call in for interview
to: interview
- from: open
label: Hire straight away
to: hired
- from: open
label: Not a fit
to: declined
name: People who want to work here
- action: /project_managers
consequence:
- Confirm
description: Everyone who's come to us with a building to fix or a project to build, from first contact to a decision.
features:
- description: ''
name: ''
resource:
requires_group: project_managers
source:
bucket: enquiries
kind: kv
transitions:
- from: open
label: Log the survey
to: surveyed
- from: open
label: Send a price
to: quoted
- from: open
label: Mark as won
to: won
- from: open
label: Mark as lost
to: lost
- from: open
label: Turn down
to: declined
- from: quoted
label: Mark as won
to: won
- from: quoted
label: Mark as lost
to: lost
- from: quoted
label: Turn down
to: declined
- from: surveyed
label: Send a price
to: quoted
- from: surveyed
label: Mark as won
to: won
- from: surveyed
label: Mark as lost
to: lost
- from: surveyed
label: Turn down
to: declined
name: Building work people want done
- action: /project_managers
consequence:
- Confirm
description: Trade firms asking to be on our list, from first application to a decision.
features:
- description: ''
name: ''
resource:
requires_group: project_managers
source:
bucket: subcontractors
kind: kv
transitions:
- from: checking
label: Ask for papers
to: papers_requested
- from: checking
label: Approve them
to: approved
- from: checking
label: Turn down
to: rejected
- from: open
label: Start checking
to: checking
- from: open
label: Turn down
to: rejected
- from: papers_requested
label: Approve them
to: approved
- from: papers_requested
label: Turn down
to: rejected
name: Firms wanting to work with us
- action: /project_managers
consequence:
- Send invite
description: Bring another project manager onto this desk with a one-time link.
features:
- description: ''
name: Invite a project manager
requirements:
- label: Name
name: name
- label: Email address
name: email
type: email
invite:
group: project_managers
name: Add another project manager
- action: /project_managers
consequence:
- Confirm
description: Project managers you've invited who haven't signed in yet.
features:
- description: ''
name: ''
resource:
requires_group: project_managers
source:
bucket: portal_invites
kind: kv
transitions:
- from: open
label: Signed in
to: done
name: Invites sent, waiting on a reply
description: Your desk for building enquiries, subcontractor applications and job applications, all in one place.
name: What needs my attention today?
responsible:
contact: ingrid@nordvikbygg.example
name: Ingrid Nordvik
@@ -0,0 +1,10 @@
alternatives:
- description: One of our project managers will look over what you've sent and get in touch to arrange a site visit, usually within a few working days.
name: A project manager will call you
- action: /
consequence:
- Back to home
description: ''
name: Back to home
description: Thanks for telling us about the building. We've received your report and logged it.
name: What happens now that we've sent our building problem in?
@@ -0,0 +1,10 @@
alternatives:
- description: Ingrid goes through applications a few times a week and calls if there's a fit.
name: Ingrid reviews your application
- action: /
consequence:
- Back to home
description: ''
name: Back to home
description: Thanks for sending your application. Ingrid will have a look and get back to you.
name: What happens to my application now?
@@ -0,0 +1,10 @@
alternatives:
- description: We'll check what you've sent, work out the drawings, permit and price, and be in touch within a couple of days.
name: We'll price up your build
- action: /
consequence:
- Back to home
description: ''
name: Back to home
description: Thanks for sending over your plans. Ingrid will look them over and get back to you with next steps.
name: What happens now that I've sent this in?
@@ -0,0 +1,10 @@
alternatives:
- description: We check your certificates and insurance, then let you know if we need anything else before you're on the list.
name: We review your application
- action: /
consequence:
- Back to home
description: ''
name: Back to home
description: Thanks for applying to join our subcontractor list. We'll go through your papers and get back to you.
name: What happens now that we've sent this in?
@@ -0,0 +1 @@
qualifies: safety_officer
@@ -0,0 +1,56 @@
alternatives:
- action: /safety_officer
consequence:
- Confirm
description: Hazards, near misses and wrong materials reported from site, ours or a subcontractor's.
features:
- description: ''
name: ''
resource:
requires_group: safety_officer
source:
bucket: site_reports
kind: kv
transitions:
- from: open
label: Mark sorted
to: closed
name: What's been flagged from site
- action: /safety_officer
consequence:
- Send invite
description: Give another safety officer their own login so they can see and close reports too.
features:
- description: ''
name: Invite a safety officer
requirements:
- label: Their name
name: name
- label: Their email
name: email
type: email
invite:
group: safety_officer
name: Bring in another safety officer
- action: /safety_officer
consequence:
- Confirm
description: Safety officers you've invited, and whether they've taken up the invite yet.
features:
- description: ''
name: ''
resource:
requires_group: safety_officer
source:
bucket: portal_invites
kind: kv
transitions:
- from: open
label: Signed up
to: done
name: Who you've invited so far
description: Reports coming in from site, so nothing gets forgotten before it becomes a problem.
name: What's come in from site that needs sorting?
responsible:
contact: ingrid@nordvikbygg.example
name: Ingrid Nordvik
@@ -0,0 +1,5 @@
lang: en
mail:
from: Nordvik Bygg <post@nordvikbygg.example>
reply_to: ingrid@nordvikbygg.example
title: Nordvik Bygg
@@ -0,0 +1,393 @@
{
"aggregates.yaml": {
"applications": {
"declined": {
"body": "Thanks for taking the time to apply. We've decided to go with other candidates this time, but we'll hang on to your details in case something suits down the line. Good luck out there.",
"subject": "Your application with Nordvik Bygg"
},
"hired": {
"body": "Good news - we'd like to bring you on board. Ingrid will be in touch shortly to sort out start date and paperwork. Welcome to the crew.",
"subject": "Welcome to Nordvik Bygg"
},
"interview": {
"body": "We'd like to meet you. Someone from our team will call you soon to find a time. Have a couple of past jobs ready to talk through.",
"subject": "Let's talk - Nordvik Bygg"
},
"open": {
"body": "Thanks for reaching out about work with us. We're looking through applications now and will get back to you soon either way.",
"subject": "We've got your application"
}
},
"enquiries": {
"declined": {
"body": "We won't be able to take this one on. Sorry we can't help this time - feel free to come back to us if things change.",
"subject": "About your enquiry"
},
"lost": {
"body": "You've gone with someone else for this job - no hard feelings. If anything else comes up on the building, give us a shout.",
"subject": "About your quote"
},
"open": {
"body": "We've received your enquiry and will be in touch to arrange a look at the building. No need to do anything else for now.",
"subject": "We've got your enquiry"
},
"quoted": {
"body": "Your quote is ready - see the details at {site}. Let us know if you'd like to go ahead or if anything needs explaining.",
"subject": "Your quote from Nordvik Bygg"
},
"won": {
"body": "Great - you're in. We'll be in touch to plan dates and next steps for getting the work started.",
"subject": "You're booked in with Nordvik Bygg"
}
},
"subcontractors": {
"approved": {
"body": "You're approved and now on our subcontractor list. We'll reach out when work comes up that suits you.",
"subject": "You're on our subcontractor list"
},
"open": {
"body": "Thanks for applying to work with us. We're going through your details and will come back to you soon.",
"subject": "We've got your application"
},
"papers_requested": {
"body": "Before we can approve you, we need a few papers from you - see what's needed at {site}. Send them across when you can.",
"subject": "We need a few documents from you"
},
"rejected": {
"body": "We won't be adding you to our subcontractor list at this time. Thanks for your interest - you're welcome to apply again later.",
"subject": "About your subcontractor application"
}
}
},
"questions/crew/index.yaml": {
"buckets": {},
"confirm": "Confirm",
"description": "The desk for keeping on top of enquiries, quotes and crew as they move through the job.",
"invited": {
"description": "Everyone you've invited into the crew, and whether they've come on board yet.",
"done": "Joined",
"heading": "Who you've invited so far"
},
"invites": {
"crew": {
"button": "Send invite",
"description": "Bring another project manager onto the desk so they can see and work the same cases.",
"form_title": "Invite to the crew",
"heading": "Get a colleague working alongside you",
"labels": {
"email": "Their email",
"name": "Their name"
}
}
},
"links": {
"site-report": {
"button": "Open site reports",
"description": "See what's been flagged from site before it's forgotten - hazards, near misses, wrong materials.",
"heading": "See what the crew has flagged from site"
}
},
"question": "What needs your attention on the desk right now?"
},
"questions/crew/site-report-sent.yaml": {
"back": "Back to site",
"description": "Your report has gone straight to Ingrid, our safety officer. She reads these as they come in and follows up if it needs action.",
"next_description": "If it's urgent, she'll ring the site directly. Otherwise expect a note once she's looked into it.",
"next_heading": "Ingrid follows up if needed",
"question": "What happens to my report now?"
},
"questions/crew/site-report.yaml": {
"button": "Report it now",
"description": "See a hazard, near miss or wrong materials on site? Log it before it slips your mind.",
"encouragement": "Takes under a minute. Ingrid's team acts on it straight away.",
"form_description": "Just say where and what's wrong, we'll take it from there.",
"form_title": "Report from site",
"heading": "Flag a hazard on site",
"hints": {
"description": "Scaffolding missing a guardrail on the north side, second floor.",
"location": "North side, 2nd floor scaffolding",
"type": "Hazard"
},
"icon": "alert-triangle",
"labels": {
"description": "What's wrong",
"location": "Where on site",
"type": "What kind of issue"
},
"page_description": "Spotted something unsafe, a near miss, or the wrong materials on site? Report it here before it's forgotten.",
"question": "Is something on this site unsafe or not right?",
"road_description": "Your report goes straight to the safety officer, who looks into it and closes it out once it's sorted.",
"road_icon": "check-circle",
"road_title": "What happens next",
"who_description": "The safety officer reads every report and follows up directly, call Ingrid Nordvik on ingrid@nordvikbygg.example if it can't wait.",
"who_icon": "shield",
"who_title": "Who sees this"
},
"questions/index.yaml": {
"description": "We survey the building, tell you what it needs and what it costs, get the permit sorted, and do the work ourselves with carpenters and trusted subcontractors.",
"doors": {},
"needs": {
"building-problem": {
"button": "Send it in",
"description": "Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs.",
"encouragement": "A few lines and a phone number is all we need to get started.",
"form_description": "The more you can tell us about what you're seeing, the better we can prepare before we come out.",
"form_title": "Tell us about it",
"heading": "Get someone out to look at it",
"hints": {
"address": "Storgata 14, 0155 Oslo",
"email": "you@example.com",
"name": "Kari Hansen",
"phone": "+47 900 00 000",
"problem": "Damp patch spreading across the ceiling in the stairwell"
},
"icon": "search",
"labels": {
"address": "Address",
"email": "Email",
"name": "Name",
"phone": "Phone",
"problem": "What's the problem?"
},
"road_description": "We come out and survey the building, then send you a quote. If you go ahead with us, the work is booked in; if not, no hard feelings.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and gets back to you; call us in the meantime if it's urgent.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"job-application": {
"button": "Apply",
"description": "Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.",
"encouragement": "No need for a full CV to start, just tell us who you are and what you do.",
"form_description": "A few lines about your experience is a good start.",
"form_title": "Tell us about yourself",
"heading": "Ask if we're hiring",
"hints": {
"email": "you@example.com",
"message": "Trained carpenter, three years on renovation jobs",
"name": "Erik Solheim",
"role": "Carpenter"
},
"icon": "hammer",
"labels": {
"email": "Email",
"message": "Tell us about yourself",
"name": "Name",
"role": "What kind of work?"
},
"road_description": "We read what you send, invite you in for a chat if it looks like a fit, and let you know either way.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and reaches out if there's a fit.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"known-project": {
"button": "Get a quote",
"description": "You know what you want built. We'll draw it up, handle the permit application, and give you a price.",
"encouragement": "Send what you've got, even a rough sketch or a few notes is enough to start with.",
"form_description": "Tell us what you're planning and where, and we'll take it from there.",
"form_title": "Tell us your plans",
"heading": "Get drawings, a permit and a price",
"hints": {
"address": "Bakkegata 7, 0650 Oslo",
"email": "you@example.com",
"name": "Ola Berg",
"project": "Loft conversion, two new bedrooms and a bathroom"
},
"icon": "ruler",
"labels": {
"address": "Address",
"email": "Email",
"name": "Name",
"project": "What are you planning?"
},
"road_description": "We survey the site, then send you a quote covering drawings, permit and build. Say yes and we get to work; say no and that's fine too.",
"road_icon": "route",
"road_title": "What happens next",
"who_description": "A project manager reads this and gets back to you; call us in the meantime if you'd rather talk it through.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
},
"subcontractor-application": {
"button": "Apply",
"description": "Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.",
"encouragement": "Have your registration number and insurance handy, that's really all we need to get started.",
"form_description": "We'll check your papers and get back to you.",
"form_title": "Tell us about your firm",
"heading": "Get on our list of subcontractors",
"hints": {
"company_name": "Berg Elektro AS",
"email": "post@example.com",
"insurance": "Yes, valid through 2027",
"registration_number": "NO 123 456 789",
"trade": "Electrical"
},
"icon": "handshake",
"labels": {
"company_name": "Company name",
"email": "Email",
"insurance": "Insurance in place?",
"registration_number": "Registration number",
"trade": "Trade"
},
"road_description": "We check your papers, may ask for more documents, and let you know if you're approved.",
"road_icon": "clipboard-list",
"road_title": "What happens next",
"who_description": "A project manager reviews your application; feel free to call if you have questions while you wait.",
"who_icon": "user-check",
"who_title": "Who you'll hear from"
}
},
"opener": {
"description": "We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint.",
"features": {
"design-permit-build": {
"description": "Drawings, the permit application, and the building work, all handled by us and the trades we trust.",
"heading": "One team from drawings to finished build",
"icon": "hammer"
},
"survey-and-quote": {
"description": "We come look at the building, work out what's actually wrong, and give you a clear price for fixing it.",
"heading": "Know what it needs and what it costs",
"icon": "search"
}
},
"heading": "Old buildings, put right by people who know them"
},
"question": "What do you need done?",
"shopping": {
"description": "Not ready to reach out yet? Have a look around first.",
"heading": "See how we work",
"items": {}
}
},
"questions/project_managers/index.yaml": {
"buckets": {
"applications": {
"description": "People asking if we're hiring, from first message through to an offer.",
"heading": "People who want to work here",
"moves": {
"interview->declined": "Not moving forward",
"interview->hired": "Offer the job",
"open->declined": "Not a fit",
"open->hired": "Hire straight away",
"open->interview": "Call in for interview"
}
},
"enquiries": {
"description": "Everyone who's come to us with a building to fix or a project to build, from first contact to a decision.",
"heading": "Building work people want done",
"moves": {
"open->declined": "Turn down",
"open->lost": "Mark as lost",
"open->quoted": "Send a price",
"open->surveyed": "Log the survey",
"open->won": "Mark as won",
"quoted->declined": "Turn down",
"quoted->lost": "Mark as lost",
"quoted->won": "Mark as won",
"surveyed->declined": "Turn down",
"surveyed->lost": "Mark as lost",
"surveyed->quoted": "Send a price",
"surveyed->won": "Mark as won"
}
},
"subcontractors": {
"description": "Trade firms asking to be on our list, from first application to a decision.",
"heading": "Firms wanting to work with us",
"moves": {
"checking->approved": "Approve them",
"checking->papers_requested": "Ask for papers",
"checking->rejected": "Turn down",
"open->checking": "Start checking",
"open->rejected": "Turn down",
"papers_requested->approved": "Approve them",
"papers_requested->rejected": "Turn down"
}
}
},
"confirm": "Confirm",
"description": "Your desk for building enquiries, subcontractor applications and job applications, all in one place.",
"invited": {
"description": "Project managers you've invited who haven't signed in yet.",
"done": "Signed in",
"heading": "Invites sent, waiting on a reply"
},
"invites": {
"project_managers": {
"button": "Send invite",
"description": "Bring another project manager onto this desk with a one-time link.",
"form_title": "Invite a project manager",
"heading": "Add another project manager",
"labels": {
"email": "Email address",
"name": "Name"
}
}
},
"links": {},
"question": "What needs my attention today?"
},
"questions/received/building-problem.yaml": {
"back": "Back to home",
"description": "Thanks for telling us about the building. We've received your report and logged it.",
"next_description": "One of our project managers will look over what you've sent and get in touch to arrange a site visit, usually within a few working days.",
"next_heading": "A project manager will call you",
"question": "What happens now that we've sent our building problem in?"
},
"questions/received/job-application.yaml": {
"back": "Back to home",
"description": "Thanks for sending your application. Ingrid will have a look and get back to you.",
"next_description": "Ingrid goes through applications a few times a week and calls if there's a fit.",
"next_heading": "Ingrid reviews your application",
"question": "What happens to my application now?"
},
"questions/received/known-project.yaml": {
"back": "Back to home",
"description": "Thanks for sending over your plans. Ingrid will look them over and get back to you with next steps.",
"next_description": "We'll check what you've sent, work out the drawings, permit and price, and be in touch within a couple of days.",
"next_heading": "We'll price up your build",
"question": "What happens now that I've sent this in?"
},
"questions/received/subcontractor-application.yaml": {
"back": "Back to home",
"description": "Thanks for applying to join our subcontractor list. We'll go through your papers and get back to you.",
"next_description": "We check your certificates and insurance, then let you know if we need anything else before you're on the list.",
"next_heading": "We review your application",
"question": "What happens now that we've sent this in?"
},
"questions/safety_officer/index.yaml": {
"buckets": {
"site_reports": {
"description": "Hazards, near misses and wrong materials reported from site, ours or a subcontractor's.",
"heading": "What's been flagged from site",
"moves": {
"open->closed": "Mark sorted"
}
}
},
"confirm": "Confirm",
"description": "Reports coming in from site, so nothing gets forgotten before it becomes a problem.",
"invited": {
"description": "Safety officers you've invited, and whether they've taken up the invite yet.",
"done": "Signed up",
"heading": "Who you've invited so far"
},
"invites": {
"safety_officer": {
"button": "Send invite",
"description": "Give another safety officer their own login so they can see and close reports too.",
"form_title": "Invite a safety officer",
"heading": "Bring in another safety officer",
"labels": {
"email": "Their email",
"name": "Their name"
}
}
},
"links": {},
"question": "What's come in from site that needs sorting?"
}
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/sh
# The noise floor: answer one run's tasks with several seeds and print
# each seed's score, so a change can be told from the visitor's mood.
# runs/spread.sh runs/<run> [seeds...] (default seeds: 1 2 3)
set -eu
run=${1:?usage: spread.sh runs/<run> [seeds...]}; shift
seeds=${*:-1 2 3}
IRIS=/var/local/cargo-target/release/iris
T=/var/local/cargo-target/release/portal-trainer
LLM="MODEL=qwen3:8b $(cd "$(dirname "$0")/.." && pwd)/engines/ollama.sh"
cd "$run"
for mode in full skim; do
skim=""; [ "$mode" = skim ] && skim="--skim"
for s in $seeds; do
$T answer --tasks tasks-$mode.jsonl --repo site --llm "$LLM" --seed "$s" > answers-$mode-seed$s.jsonl
printf "%s seed %s: " "$mode" "$s"
$IRIS check --path site/questions --needs-tasks tasks-$mode.jsonl $skim --needs-score answers-$mode-seed$s.jsonl 2>&1 | grep -E "^wording:"
done
done
@@ -0,0 +1,8 @@
{"id":"housing-board-damp@/","persona":"housing-board-damp","need":"building-problem","page":"/","state":{"body":"I chair the board of a housing cooperative from the seventies. Two ground-floor flats have damp in the walls and we don't know if it's drainage or the facade. We need someone to tell us.","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get someone out to look at it"]}
{"id":"buyer-before-purchase@/","persona":"buyer-before-purchase","need":"building-problem","page":"/","state":{"body":"We are about to buy an old timber house. Before we sign we want a professional to go through it and tell us what is wrong with it.","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get someone out to look at it"]}
{"id":"attic-conversion@/","persona":"attic-conversion","need":"known-project","page":"/","state":{"body":"We want to turn our attic into two bedrooms and a bathroom. We need drawings and someone who handles the application to the municipality.","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get drawings, a permit and a price"]}
{"id":"shop-to-flat@/","persona":"shop-to-flat","need":"known-project","page":"/","state":{"body":"I own a former shop on the ground floor and want to make it a flat. I have no idea what is allowed. Can you sort that out and give me a price?","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get drawings, a permit and a price"]}
{"id":"electrician-firm@/","persona":"electrician-firm","need":"subcontractor-application","page":"/","state":{"body":"We are a four-person electrical firm, fully certified. We would like to get on your list so you call us when you need electricians.","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get on our list of subcontractors"]}
{"id":"scaffolder@/","persona":"scaffolder","need":"subcontractor-application","page":"/","state":{"body":"I run a scaffolding company. How do I get to do jobs for you?","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Get on our list of subcontractors"]}
{"id":"carpenter-jobseeker@/","persona":"carpenter-jobseeker","need":"job-application","page":"/","state":{"body":"I'm a certified carpenter with eight years on rehabilitation jobs. Are you hiring?","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Ask if we're hiring"]}
{"id":"apprentice@/","persona":"apprentice","need":"job-application","page":"/","state":{"body":"I finish vocational school this spring and need an apprenticeship as a bricklayer.","page":"Old buildings, put right by people who know them: We've been surveying, permitting and rebuilding old buildings for years, from the first look to the last coat of paint. One team from drawings to finished build: Drawings, the permit application, and the building work, all handled by us and the trades we trust. Know what it needs and what it costs: We come look at the building, work out what's actually wrong, and give you a clear price for fixing it."},"questions":{"pick":{"type":"choice","instructions":"A visitor reads the page question \"What do you need done?\". Which alternative do they choose?","criteria":{"Ask if we're hiring":"Carpenter or apprentice, we're always glad to hear from good people. Tell us a bit about yourself.","Get drawings, a permit and a price":"You know what you want built. We'll draw it up, handle the permit application, and give you a price.","Get on our list of subcontractors":"Want to work with us on electrical, plumbing or scaffolding jobs? Send us your details and we'll take it from there.","Get someone out to look at it":"Tell us what's wrong and where. We'll come out, take a look, and tell you straight what it needs and what it costs."}}},"expect":["Ask if we're hiring"]}