diff --git a/runs/contractor-planned-2026-09-24/README.md b/runs/contractor-planned-2026-09-24/README.md new file mode 100644 index 0000000..0e7eeb3 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/README.md @@ -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. diff --git a/runs/contractor-planned-2026-09-24/answers-full-seed0.jsonl b/runs/contractor-planned-2026-09-24/answers-full-seed0.jsonl new file mode 100644 index 0000000..cb9de1a --- /dev/null +++ b/runs/contractor-planned-2026-09-24/answers-full-seed0.jsonl @@ -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@/"} diff --git a/runs/contractor-planned-2026-09-24/answers-full-seed1.jsonl b/runs/contractor-planned-2026-09-24/answers-full-seed1.jsonl new file mode 100644 index 0000000..21ebe69 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/answers-full-seed1.jsonl @@ -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@/"} diff --git a/runs/contractor-planned-2026-09-24/answers-full-seed2.jsonl b/runs/contractor-planned-2026-09-24/answers-full-seed2.jsonl new file mode 100644 index 0000000..9593027 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/answers-full-seed2.jsonl @@ -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@/"} diff --git a/runs/contractor-planned-2026-09-24/llm/01-prompt.md b/runs/contractor-planned-2026-09-24/llm/01-prompt.md new file mode 100644 index 0000000..4383e70 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/llm/01-prompt.md @@ -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: +language: en # the intake's language code +contact: { name: , email: } +about: > + What the business does, in its own words. +mail: { from: " ", reply_to: } + # 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: # 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: # the door this public need sits behind; omit to put it on the front door + enters_as: # ONLY for a role inside the business; omit for the public + lands_in: # snake_case, ASCII + handled_by: # the role that must see and move the record + stages: [open, , ..., , ] + # 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: [, ] # every stage that counts as finished, good or bad + success: [] # the finished stages that are a good outcome for the business + skippable: [] # stages a case may pass over (papers already complete) + moves_by: { : [, ...] } + # 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: [] # 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, : submitter, :
} + # 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. \ No newline at end of file diff --git a/runs/contractor-planned-2026-09-24/llm/01-reply.md b/runs/contractor-planned-2026-09-24/llm/01-reply.md new file mode 100644 index 0000000..6e6437a --- /dev/null +++ b/runs/contractor-planned-2026-09-24/llm/01-reply.md @@ -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 ", 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 } +``` diff --git a/runs/contractor-planned-2026-09-24/model.json b/runs/contractor-planned-2026-09-24/model.json new file mode 100644 index 0000000..f25734a --- /dev/null +++ b/runs/contractor-planned-2026-09-24/model.json @@ -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." + } + ] +} \ No newline at end of file diff --git a/runs/contractor-planned-2026-09-24/plan.yaml b/runs/contractor-planned-2026-09-24/plan.yaml new file mode 100644 index 0000000..36fadaa --- /dev/null +++ b/runs/contractor-planned-2026-09-24/plan.yaml @@ -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 ", 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. diff --git a/runs/contractor-planned-2026-09-24/site/aggregates.yaml b/runs/contractor-planned-2026-09-24/site/aggregates.yaml new file mode 100644 index 0000000..36e64e0 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/aggregates.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/llm/01-aggregates.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/01-aggregates.yaml.md new file mode 100644 index 0000000..b6ec0c5 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/01-aggregates.yaml.md @@ -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 +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": "", + "subject": "" + }, + "hired": { + "body": "", + "subject": "" + }, + "interview": { + "body": "", + "subject": "" + }, + "open": { + "body": "", + "subject": "" + } + }, + "enquiries": { + "declined": { + "body": "", + "subject": "" + }, + "lost": { + "body": "", + "subject": "" + }, + "open": { + "body": "", + "subject": "" + }, + "quoted": { + "body": "", + "subject": "" + }, + "won": { + "body": "", + "subject": "" + } + }, + "subcontractors": { + "approved": { + "body": "", + "subject": "" + }, + "open": { + "body": "", + "subject": "" + }, + "papers_requested": { + "body": "", + "subject": "" + }, + "rejected": { + "body": "", + "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" + } + } +} diff --git a/runs/contractor-planned-2026-09-24/site/llm/02-questions_crew_index.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/02-questions_crew_index.yaml.md new file mode 100644 index 0000000..e47652c --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/02-questions_crew_index.yaml.md @@ -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 +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": "", + "description": "", + "invited": { + "description": "", + "done": "", + "heading": "" + }, + "invites": { + "crew": { + "button": "", + "description": "", + "form_title": "", + "heading": "", + "labels": { + "email": "", + "name": "" + } + } + }, + "links": { + "site-report": { + "button": "", + "description": "", + "heading": "" + } + }, + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/03-questions_crew_site-report-sent.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/03-questions_crew_site-report-sent.yaml.md new file mode 100644 index 0000000..65be451 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/03-questions_crew_site-report-sent.yaml.md @@ -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 +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": "", + "description": "", + "next_description": "", + "next_heading": "", + "question": "" +} + +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?" +} diff --git a/runs/contractor-planned-2026-09-24/site/llm/04-questions_crew_site-report.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/04-questions_crew_site-report.yaml.md new file mode 100644 index 0000000..427008c --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/04-questions_crew_site-report.yaml.md @@ -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 +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": "", + "description": "", + "encouragement": "", + "form_description": "", + "form_title": "", + "heading": "", + "hints": { + "description": "", + "location": "", + "type": "" + }, + "icon": "", + "labels": { + "description": "", + "location": "", + "type": "" + }, + "page_description": "", + "question": "", + "road_description": "", + "road_icon": "", + "road_title": "", + "who_description": "", + "who_icon": "", + "who_title": "" +} + +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" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/05-questions_index.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/05-questions_index.yaml.md new file mode 100644 index 0000000..49395a4 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/05-questions_index.yaml.md @@ -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 +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": "", + "doors": {}, + "needs": { + "building-problem": { + "button": "", + "description": "", + "encouragement": "", + "form_description": "", + "form_title": "", + "heading": "", + "hints": { + "address": "", + "email": "", + "name": "", + "phone": "", + "problem": "" + }, + "icon": "", + "labels": { + "address": "", + "email": "", + "name": "", + "phone": "", + "problem": "" + }, + "road_description": "", + "road_icon": "", + "road_title": "", + "who_description": "", + "who_icon": "", + "who_title": "" + }, + "job-application": { + "button": "", + "description": "", + "encouragement": "", + "form_description": "", + "form_title": "", + "heading": "", + "hints": { + "email": "", + "message": "", + "name": "", + "role": "" + }, + "icon": "", + "labels": { + "email": "", + "message": "", + "name": "", + "role": "" + }, + "road_description": "", + "road_icon": "", + "road_title": "", + "who_description": "", + "who_icon": "", + "who_title": "" + }, + "known-project": { + "button": "", + "description": "", + "encouragement": "", + "form_description": "", + "form_title": "", + "heading": "", + "hints": { + "address": "", + "email": "", + "name": "", + "project": "" + }, + "icon": "", + "labels": { + "address": "", + "email": "", + "name": "", + "project": "" + }, + "road_description": "", + "road_icon": "", + "road_title": "", + "who_description": "", + "who_icon": "", + "who_title": "" + }, + "subcontractor-application": { + "button": "", + "description": "", + "encouragement": "", + "form_description": "", + "form_title": "", + "heading": "", + "hints": { + "company_name": "", + "email": "", + "insurance": "", + "registration_number": "", + "trade": "" + }, + "icon": "", + "labels": { + "company_name": "", + "email": "", + "insurance": "", + "registration_number": "", + "trade": "" + }, + "road_description": "", + "road_icon": "", + "road_title": "", + "who_description": "", + "who_icon": "", + "who_title": "" + } + }, + "opener": { + "description": "", + "features": { + "design-permit-build": { + "description": "", + "heading": "", + "icon": "" + }, + "survey-and-quote": { + "description": "", + "heading": "", + "icon": "" + } + }, + "heading": "" + }, + "question": "", + "shopping": { + "description": "", + "heading": "", + "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": {} + } +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/06-questions_project_managers_index.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/06-questions_project_managers_index.yaml.md new file mode 100644 index 0000000..ab16c3e --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/06-questions_project_managers_index.yaml.md @@ -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 +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": "", + "heading": "", + "moves": { + "interview->declined": "declined>", + "interview->hired": "hired>", + "open->declined": "declined>", + "open->hired": "hired>", + "open->interview": "interview>" + } + }, + "enquiries": { + "description": "", + "heading": "", + "moves": { + "open->declined": "declined>", + "open->lost": "lost>", + "open->quoted": "quoted>", + "open->surveyed": "surveyed>", + "open->won": "won>", + "quoted->declined": "declined>", + "quoted->lost": "lost>", + "quoted->won": "won>", + "surveyed->declined": "declined>", + "surveyed->lost": "lost>", + "surveyed->quoted": "quoted>", + "surveyed->won": "won>" + } + }, + "subcontractors": { + "description": "", + "heading": "", + "moves": { + "checking->approved": "approved>", + "checking->papers_requested": "papers_requested>", + "checking->rejected": "rejected>", + "open->checking": "checking>", + "open->rejected": "rejected>", + "papers_requested->approved": "approved>", + "papers_requested->rejected": "rejected>" + } + } + }, + "confirm": "", + "description": "", + "invited": { + "description": "", + "done": "", + "heading": "" + }, + "invites": { + "project_managers": { + "button": "", + "description": "", + "form_title": "", + "heading": "", + "labels": { + "email": "", + "name": "" + } + } + }, + "links": {}, + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/07-questions_received_building-problem.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/07-questions_received_building-problem.yaml.md new file mode 100644 index 0000000..e43a298 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/07-questions_received_building-problem.yaml.md @@ -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 +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": "", + "description": "", + "next_description": "", + "next_heading": "", + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/08-questions_received_job-application.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/08-questions_received_job-application.yaml.md new file mode 100644 index 0000000..e33ba2c --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/08-questions_received_job-application.yaml.md @@ -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 +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": "", + "description": "", + "next_description": "", + "next_heading": "", + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/09-questions_received_known-project.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/09-questions_received_known-project.yaml.md new file mode 100644 index 0000000..2ca646d --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/09-questions_received_known-project.yaml.md @@ -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 +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": "", + "description": "", + "next_description": "", + "next_heading": "", + "question": "" +} + +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?" +} diff --git a/runs/contractor-planned-2026-09-24/site/llm/10-questions_received_subcontractor-application.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/10-questions_received_subcontractor-application.yaml.md new file mode 100644 index 0000000..9a329ee --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/10-questions_received_subcontractor-application.yaml.md @@ -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 +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": "", + "description": "", + "next_description": "", + "next_heading": "", + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/llm/11-questions_safety_officer_index.yaml.md b/runs/contractor-planned-2026-09-24/site/llm/11-questions_safety_officer_index.yaml.md new file mode 100644 index 0000000..6bce93a --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/llm/11-questions_safety_officer_index.yaml.md @@ -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 +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": "", + "heading": "", + "moves": { + "open->closed": "closed>" + } + } + }, + "confirm": "", + "description": "", + "invited": { + "description": "", + "done": "", + "heading": "" + }, + "invites": { + "safety_officer": { + "button": "", + "description": "", + "form_title": "", + "heading": "", + "labels": { + "email": "", + "name": "" + } + } + }, + "links": {}, + "question": "" +} + +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?" +} +``` diff --git a/runs/contractor-planned-2026-09-24/site/needs.yaml b/runs/contractor-planned-2026-09-24/site/needs.yaml new file mode 100644 index 0000000..311ce37 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/needs.yaml @@ -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. diff --git a/runs/contractor-planned-2026-09-24/site/questions/crew/_section.yaml b/runs/contractor-planned-2026-09-24/site/questions/crew/_section.yaml new file mode 100644 index 0000000..1f962a5 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/crew/_section.yaml @@ -0,0 +1 @@ +qualifies: crew diff --git a/runs/contractor-planned-2026-09-24/site/questions/crew/index.yaml b/runs/contractor-planned-2026-09-24/site/questions/crew/index.yaml new file mode 100644 index 0000000..eb60ddc --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/crew/index.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/questions/crew/site-report-sent.yaml b/runs/contractor-planned-2026-09-24/site/questions/crew/site-report-sent.yaml new file mode 100644 index 0000000..a1b0b96 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/crew/site-report-sent.yaml @@ -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? diff --git a/runs/contractor-planned-2026-09-24/site/questions/crew/site-report.yaml b/runs/contractor-planned-2026-09-24/site/questions/crew/site-report.yaml new file mode 100644 index 0000000..aa1a854 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/crew/site-report.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/questions/index.yaml b/runs/contractor-planned-2026-09-24/site/questions/index.yaml new file mode 100644 index 0000000..97161c1 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/index.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/questions/project_managers/_section.yaml b/runs/contractor-planned-2026-09-24/site/questions/project_managers/_section.yaml new file mode 100644 index 0000000..d8acdff --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/project_managers/_section.yaml @@ -0,0 +1 @@ +qualifies: project_managers diff --git a/runs/contractor-planned-2026-09-24/site/questions/project_managers/index.yaml b/runs/contractor-planned-2026-09-24/site/questions/project_managers/index.yaml new file mode 100644 index 0000000..fd256ef --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/project_managers/index.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/questions/received/building-problem.yaml b/runs/contractor-planned-2026-09-24/site/questions/received/building-problem.yaml new file mode 100644 index 0000000..a104358 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/received/building-problem.yaml @@ -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? diff --git a/runs/contractor-planned-2026-09-24/site/questions/received/job-application.yaml b/runs/contractor-planned-2026-09-24/site/questions/received/job-application.yaml new file mode 100644 index 0000000..c4016f9 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/received/job-application.yaml @@ -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? diff --git a/runs/contractor-planned-2026-09-24/site/questions/received/known-project.yaml b/runs/contractor-planned-2026-09-24/site/questions/received/known-project.yaml new file mode 100644 index 0000000..8505774 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/received/known-project.yaml @@ -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? diff --git a/runs/contractor-planned-2026-09-24/site/questions/received/subcontractor-application.yaml b/runs/contractor-planned-2026-09-24/site/questions/received/subcontractor-application.yaml new file mode 100644 index 0000000..a922f9f --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/received/subcontractor-application.yaml @@ -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? diff --git a/runs/contractor-planned-2026-09-24/site/questions/safety_officer/_section.yaml b/runs/contractor-planned-2026-09-24/site/questions/safety_officer/_section.yaml new file mode 100644 index 0000000..d7ea7a1 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/safety_officer/_section.yaml @@ -0,0 +1 @@ +qualifies: safety_officer diff --git a/runs/contractor-planned-2026-09-24/site/questions/safety_officer/index.yaml b/runs/contractor-planned-2026-09-24/site/questions/safety_officer/index.yaml new file mode 100644 index 0000000..26366b4 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/questions/safety_officer/index.yaml @@ -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 diff --git a/runs/contractor-planned-2026-09-24/site/site.yaml b/runs/contractor-planned-2026-09-24/site/site.yaml new file mode 100644 index 0000000..d632a3a --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/site.yaml @@ -0,0 +1,5 @@ +lang: en +mail: + from: Nordvik Bygg + reply_to: ingrid@nordvikbygg.example +title: Nordvik Bygg diff --git a/runs/contractor-planned-2026-09-24/site/words.json b/runs/contractor-planned-2026-09-24/site/words.json new file mode 100644 index 0000000..f36e297 --- /dev/null +++ b/runs/contractor-planned-2026-09-24/site/words.json @@ -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?" + } +} \ No newline at end of file diff --git a/runs/contractor-planned-2026-09-24/spread.sh b/runs/contractor-planned-2026-09-24/spread.sh new file mode 100755 index 0000000..c43dc8c --- /dev/null +++ b/runs/contractor-planned-2026-09-24/spread.sh @@ -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/ [seeds...] (default seeds: 1 2 3) +set -eu +run=${1:?usage: spread.sh runs/ [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 diff --git a/runs/contractor-planned-2026-09-24/tasks-full.jsonl b/runs/contractor-planned-2026-09-24/tasks-full.jsonl new file mode 100644 index 0000000..6eb83dc --- /dev/null +++ b/runs/contractor-planned-2026-09-24/tasks-full.jsonl @@ -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"]}