Test / test (pull_request) Successful in 1m7s
portal serve runs a site; portal lint is what iris was; portal plan, build, report and the rest are what portal-trainer was. One source at one version, so the three never disagree about what content means. Both histories are merged in (subtree). The release attaches the bare binary for a content repo's CI. The trainer's plans, intakes, engines and reference prompt come along; its runs stay in the old repo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
123 lines
5.7 KiB
YAML
123 lines
5.7 KiB
YAML
# The contractor from intakes/contractor.yaml as a plan: the needs spec
|
|
# plus what each form collects. Everything structural in the generated
|
|
# site comes from this file; a model only writes the words.
|
|
business: Nordvik Bygg
|
|
language: en
|
|
contact: { name: Ingrid Nordvik, email: ingrid@nordvikbygg.example }
|
|
about: >
|
|
Twelve people who survey old buildings, draw up rehabilitation plans,
|
|
handle the permit application, and do the building work with their
|
|
own carpenters plus subcontractors for electrical, plumbing and
|
|
scaffolding.
|
|
|
|
needs:
|
|
- id: survey-enquiry
|
|
who: a housing board or private owner with a problem in a building
|
|
wants: someone qualified to come and look at it and say what it takes
|
|
lands_in: enquiries
|
|
handled_by: project_managers
|
|
stages: [open, surveyed, quoted, won, lost]
|
|
done_when: [won, lost]
|
|
success: [won]
|
|
max_fields: 4
|
|
collects:
|
|
- { name: name }
|
|
- { name: phone, type: tel }
|
|
- { name: address }
|
|
- { name: problem, type: textarea }
|
|
- { name: access, optional: true }
|
|
|
|
- id: build-enquiry
|
|
who: an owner who already knows what they want built or changed
|
|
wants: drawings, a permit application and a price
|
|
lands_in: enquiries
|
|
handled_by: project_managers
|
|
stages: [open, surveyed, quoted, won, lost]
|
|
done_when: [won, lost]
|
|
success: [won]
|
|
max_fields: 5
|
|
collects:
|
|
- { name: name }
|
|
- { name: phone, type: tel }
|
|
- { name: address }
|
|
- { name: project, type: textarea }
|
|
- { name: timeframe, type: select, options: [This year, Next year, No fixed date] }
|
|
|
|
- id: log-phone-enquiry
|
|
who: a project manager who just took a call or a text about a building
|
|
wants: the enquiry written down before it gets lost
|
|
enters_as: project_managers
|
|
lands_in: enquiries
|
|
handled_by: project_managers
|
|
stages: [open, surveyed, quoted, won, lost]
|
|
done_when: [won, lost]
|
|
success: [won]
|
|
max_fields: 4
|
|
collects:
|
|
- { name: caller }
|
|
- { name: phone, type: tel }
|
|
- { name: address }
|
|
- { name: problem, type: textarea }
|
|
|
|
- id: subcontractor-application
|
|
who: a trade firm doing electrical, plumbing or scaffolding work
|
|
wants: to be approved once, and then be called when a job needs them
|
|
lands_in: subcontractors
|
|
handled_by: project_managers
|
|
stages: [open, awaiting_papers, approved, declined]
|
|
done_when: [approved, declined]
|
|
success: [approved]
|
|
skippable: [awaiting_papers]
|
|
max_fields: 5
|
|
collects:
|
|
- { name: company }
|
|
- { name: registration_number }
|
|
- { name: trade, type: select, options: [Electrical, Plumbing, Scaffolding, Sheet metal, Other] }
|
|
- { name: contact_email, type: email }
|
|
- { name: insurance_confirmed, type: select, options: ["Yes", Not yet] }
|
|
- { name: trade_approval, optional: true }
|
|
|
|
- id: job-application
|
|
who: a carpenter, bricklayer or apprentice looking for work
|
|
wants: to be considered, without writing a letter
|
|
lands_in: applicants
|
|
handled_by: project_managers
|
|
stages: [open, interviewing, hired, declined]
|
|
done_when: [hired, declined]
|
|
success: [hired]
|
|
max_fields: 3
|
|
collects:
|
|
- { name: name }
|
|
- { name: phone, type: tel }
|
|
- { name: trade, type: select, options: [Carpenter, Bricklayer, Apprentice, Other] }
|
|
- { name: experience, type: textarea, optional: true }
|
|
|
|
- id: report-site-issue
|
|
who: anyone on site, ours or a subcontractor's, on a phone with gloves on
|
|
wants: to report a hazard, a near miss or wrong materials before they forget
|
|
enters_as: crew
|
|
lands_in: site_issues
|
|
handled_by: safety_officer
|
|
stages: [open, in_hand, closed]
|
|
done_when: [closed]
|
|
success: [closed]
|
|
max_fields: 3
|
|
collects:
|
|
- { name: kind, type: select, options: [Hazard, Near miss, Wrong materials, Other] }
|
|
- { name: where }
|
|
- { name: what_happened, type: textarea }
|
|
|
|
# Held out from every model that writes words: these are the personas
|
|
# from sectors/construction, which no generator has seen.
|
|
personas:
|
|
- { id: housing-board-damp, need: survey-enquiry, 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: survey-enquiry, 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: build-enquiry, 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: build-enquiry, 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: report-site-issue, 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: report-site-issue, text: "The bathroom membrane delivered today is not the one in the specification. We stopped work on it." }
|