5 Commits
Author SHA1 Message Date
blandClaude Opus 5.5 9ae0e178db Test: Hvem består Klingenberg Bygg av? som egen side, med menneskene, erfaringene og verdiene; Hvordan presenterer du deg?
Deploy test instance / deploy (push) Successful in 3s
lint-and-reload / lint (push) Successful in 2s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 21:52:29 +02:00
blandClaude Opus 5.5 414715d64f Test: bioen kan skrives i markdown
Deploy test instance / deploy (push) Successful in 3s
lint-and-reload / lint (push) Successful in 2s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 21:39:01 +02:00
blandClaude Opus 5.5 8ae162f143 Test: et kort som er tatt ned, forsvinner fra kontorets liste etter ti minutter
lint-and-reload / lint (push) Successful in 2s
Deploy test instance / deploy (push) Successful in 3s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 20:50:46 +02:00
blandClaude Opus 5.5 6de2febec1 Test: hver ansatt retter sitt eget kort; testen følger nyeste portal ved hver push
lint-and-reload / lint (push) Successful in 2s
Deploy test instance / deploy (push) Successful in 4s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 20:39:27 +02:00
blandClaude Opus 5.5 93c6b6e6c5 Test: portal.test.klingenbergbygg.no, nyeste portal og en egen NATS; søknad på pause
Deploy test instance / deploy (push) Failing after 1s
lint-and-reload / lint (push) Failing after 1s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GT37Z1Xtfd9pUuQtMTg6Yt
2026-09-30 20:11:30 +02:00
12 changed files with 229 additions and 99 deletions

No files matched your search

+13 -23
View File
@@ -1,35 +1,25 @@
name: Deploy instance
name: Deploy test instance
# This content repo owns its portal instance: which portal version runs
# on kasse. uhhm/portal only publishes versioned release artifacts;
# PORTAL_RELEASE below pins the one this site runs, so every rollout is
# a commit - auditable, and revertable by reverting it.
#
# Content-only changes never come through here: lint-and-reload
# hot-swaps those into the running instance over NATS.
#
# Runs on the host runner, because a deploy has to touch this host's
# filesystem and its units. It is allowed exactly one root action:
# /usr/local/bin/deploy-portal-instance, which checks the instance
# against a fixed list and the tag against a release-tag shape before
# it touches anything, and health-checks the site afterwards without a
# forwarded header - a check that sends the header Caddy would send
# cannot tell you the site is broken for everything that is not Caddy.
# Branch `test` is portal.test.klingenbergbygg.no: the newest portal
# release (cut from uhhm/portal main), with a NATS of its own on kasse,
# so nothing tried here reaches production or mails a customer. The
# production site is branch `main`, pinned in its own deploy.yml.
# Every push: a test site that follows the newest release has no pin
# to change, so a push is the moment to pick the newest up.
on:
workflow_dispatch:
push:
branches: [main]
paths:
- .gitea/workflows/deploy.yml
branches: [test]
env:
PORTAL_RELEASE: v0.6.3
INSTANCE: klingenberg-portal
INSTANCE: klingenberg-test
jobs:
deploy:
runs-on: fish
steps:
- name: Ship the pinned release and restart
run: sudo /usr/local/bin/deploy-portal-instance "$INSTANCE" "$PORTAL_RELEASE"
- name: Ship the newest release and restart
run: |
tag=$(curl -sf https://project.uhhm.no/api/v1/repos/uhhm/portal/releases/latest | jq -r .tag_name)
sudo /usr/local/bin/deploy-portal-instance "$INSTANCE" "$tag"
+8 -8
View File
@@ -1,21 +1,21 @@
name: lint-and-reload
on:
push:
branches: [main]
branches: [test]
jobs:
lint:
runs-on: fish
steps:
- name: checkout
run: |
rm -rf checkout && git clone --depth 1 https://prosjekt.klingenbergbygg.no/klingenbergbygg/questions.git checkout
# The lint is portal itself (`portal lint`), at the version this
# site runs (PORTAL_RELEASE in deploy.yml).
rm -rf checkout && git clone --depth 1 --branch test https://prosjekt.klingenbergbygg.no/klingenbergbygg/questions.git checkout
# The lint is portal itself, at the newest release: the one the
# test instance runs.
- name: lint
env:
PORTAL_RELEASE: v0.6.3
run: |
curl -sfL "https://project.uhhm.no/uhhm/portal/releases/download/$PORTAL_RELEASE/portal-x86_64-linux" -o portal && chmod +x portal
tag=$(curl -sf https://project.uhhm.no/api/v1/repos/uhhm/portal/releases/latest | jq -r .tag_name)
curl -sfL "https://project.uhhm.no/uhhm/portal/releases/download/$tag/portal-x86_64-linux" -o portal && chmod +x portal
./portal lint --path checkout/questions
# The test instance's own NATS, never production's.
- name: reload
run: nats --server nats://127.0.0.1:4222 pub portal.content.reload ""
run: nats --server nats://127.0.0.1:4232 pub portal.content.reload ""
+14
View File
@@ -6,9 +6,23 @@ aggregates:
event: received
sluttet:
event: sluttet
leaves_after:
minutes: 10
transitions:
open:
- sluttet
- bucket: erfaringer
initial: open
states:
open:
event: received
fjernet:
event: fjernet
leaves_after:
minutes: 10
transitions:
open:
- fjernet
- bucket: leveranser
initial: open
states:
+35 -2
View File
@@ -89,6 +89,7 @@ needs:
i_arbeid: søknad under arbeid
levert: søknad levert
avslatt: avsluttet uten oppdrag
paused: true
- id: leveranse
who: kontoret, når en rapport, tegninger eller et vedtak er klart til kunden
wants: at kunden får dokumentet og vet at det ligger der
@@ -110,10 +111,10 @@ needs:
arkivert: arkivert
enters_as: kontor
- id: ansatt
who: kontoret, når noen begynner hos oss eller skal ha nytt portrett
who: en av oss på kontoret, som vil vise hvem hen er og hva hen kan
wants: at den som vurderer oss ser hvem som gjør jobben
enters: /kontor/ansatt
via: Legg inn en ansatt
via: Kortet ditt
lands_in: ansatte
handled_by: kontor
stages:
@@ -129,6 +130,26 @@ needs:
open: vises på forsiden
sluttet: sluttet
enters_as: kontor
- id: erfaring
who: en av oss på kontoret, når et oppdrag er verdt å vise fram
wants: at den som vurderer oss ser hva vi har gjort
enters: /kontor/erfaring
via: Et oppdrag med bilde
lands_in: erfaringer
handled_by: kontor
stages:
- open
- fjernet
done_when:
- fjernet
success:
- fjernet
max_steps: 1
max_fields: 3
stage_words:
open: vises
fjernet: fjernet
enters_as: kontor
personas:
- id: kommune-skole
need: tilstand
@@ -151,4 +172,16 @@ personas:
- id: ansvarsrett
need: soknad
text: Vi har prosjektert ombyggingen selv, men mangler noen med ansvarsrett som kan stå for søknaden.
- id: rapport-klar
need: leveranse
text: Tilstandsrapporten til borettslaget er ferdig. Jeg vil at styreleder skal få den og vite at den ligger der.
- id: ny-hos-oss
need: ansatt
text: Jeg har nettopp begynt hos Klingenberg Bygg og vil at kundene skal se hvem jeg er og hva jeg kan.
- id: nytt-portrett
need: ansatt
text: Portrettet mitt på forsiden er fra da jeg begynte. Jeg vil bytte det uten å skrive alt det andre på nytt.
- id: brannstasjonen
need: erfaring
text: Brannstasjonen i Ytre Enebakk står ferdig, og vi har gode bilder fra fundamenteringen. Den vil jeg vise fram.
tones: []
+47
View File
@@ -0,0 +1,47 @@
name: Hvem består Klingenberg Bygg av?
description: Menneskene som gjør jobben, oppdragene vi har gjort, og det vi står for.
responsible:
name: Fredrik Borch Lynghaug
contact: fredrik@klingenbergbygg.no
alternatives:
- name: Menneskene
description: De som går befaringene, skriver rapportene og står for søknadene.
features:
- name: ''
description: ''
resource:
source:
kind: kv
bucket: ansatte
public: true
states:
- open
empty: Snart presenterer vi oss her.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {name: .name, rolle: .rolle, erfaring: .erfaring, portrett: .portrett}'
- name: Erfaringer
description: Et utvalg oppdrag, med bilder.
features:
- name: ''
description: ''
resource:
source:
kind: kv
bucket: erfaringer
public: true
states:
- open
empty: Snart viser vi fram oppdrag her.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {tittel: .tittel, bilde: .bilde, om: .om}'
- name: Verdier
description: Det vi står for.
features:
- name: Mål to ganger
description: Vi måler to ganger og skriver én gang. Det gjelder betong, og det gjelder rapporter.
icon: lucide:ruler
- name: Bygget først
description: Et bygg bryr seg ikke om hvem som har rett. Vi skriver det bygget trenger, ikke det som er lettest å si.
- name: Ingen overraskelser i veggen
description: Det vi finner, får du vite. Også sprekkene.
icon: lucide:search
- name: Vannet finner en vei
description: Vannet finner alltid en vei. Derfor leter vi etter den først.
+6 -47
View File
@@ -12,22 +12,10 @@ alternatives:
- name: Prosjekt og søknad, med ansvarsrett
description: 'Vi lager arbeidsbeskrivelse opp mot [NS 3420](https://standard.no/fagomrader/ns-3420-/) og fremdriftsplan, og utarbeider byggesøknaden. Vi har sentral [godkjenning](https://sgregister.dibk.no/enterprises/976015711) innen flere fagområder og kan stå med det offentligrettslige ansvaret. Samarbeidspartner: [Westra Engineering AS](https://www.westra-engineering.no/).'
- name: Hvem består Klingenberg Bygg av?
description: Mennesker, verdier og erfaringer.
features:
- name: Erfaringene
description: Skoler i drift, brannstasjoner, omsorgsboliger, kantina på Det Norske Teatret og en Munch-eiendom på Hvitsten. Vi har gått over, prosjektert og fulgt opp bygg for kommuner, borettslag, bedrifter og private, fra borprøver i gammel mur til kunstgress på Fredrikstad stasjon.
- name: Menneskene
description: De som går befaringene, skriver rapportene og står for søknadene.
icon: lucide:users
resource:
source:
kind: kv
bucket: ansatte
public: true
states:
- open
empty: Snart presenterer vi oss her.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {name: .name, rolle: .rolle, erfaring: .erfaring, portrett: .portrett}'
description: Mennesker, erfaringer og verdier.
action: /hvem
consequence:
- Bli kjent med oss
- name: Få kartlagt byggets tilstand
description: Vi utarbeider tilstandsrapporter som representerer bygget med hensyn til fremtidige mål.
action: /received/tilstand
@@ -133,11 +121,11 @@ alternatives:
encouragements:
- Gi det beste grunnlaget for utførelse.
- name: Ta det første spadetaket med en godkjent søknad
description: Er bygget ferdig prosjektert, kan vi utarbeide en byggesøknad og utførelsesbeskrivelse for offentlig godkjenning.
description: Er bygget ferdig prosjektert, kan vi utarbeide en byggesøknad og utførelsesbeskrivelse for offentlig godkjenning. Akkurat nå har vi ikke kapasitet til nye søknadsoppdrag; vi åpner igjen så snart vi kan.
action: /received/soknad
consequence:
- Send henvendelse
record_as: soknader
disabled: true
features:
- name: Slik går det videre
description: Vi går gjennom det du har, avtaler befaring eller forhåndskonferanse, og sender deg et tilbud. Du sier selv ja eller nei, og med et ja får du en innlogging der du følger søknaden og henter dokumentene.
@@ -145,35 +133,6 @@ alternatives:
- name: Hvem leser dette
description: Fredrik på kontoret leser henvendelsen og tar kontakt. Du når ham også på fredrik@klingenbergbygg.no.
icon: lucide:users
- name: Om tiltaket
requirements:
- name: name
label: Navn
type: text
placeholder: Navn
- name: email
label: E-post
type: email
placeholder: bruker@eksempel.no
- name: telefon
label: Telefon
type: tel
optional: true
placeholder: Telefonnummer
- name: adresse
label: Hvor ligger eiendommen?
type: text
placeholder: Adresse
- name: tiltak
label: Hva går tiltaket ut på?
type: textarea
placeholder: Tilbygg, ombygging, nybygg…
- name: tegninger
label: Tegninger og prosjektering
type: file
optional: true
description: Hva skal bygges, og hvor. Avhengig av størrelsen kan vi holde forhåndskonferanse med kommunen først.
icon: lucide:file-text
encouragements:
- Nesten som å ha gravemaskin!
slideshow:
+4 -4
View File
@@ -1,8 +1,8 @@
name: Lagt ut
description: Den ansatte vises nå blant menneskene på forsiden.
name: Kortet ditt er lagret
description: Slik står du nå på forsiden.
alternatives:
- name: Skal noen ned igjen?
description: 'Trykk «Tatt av forsiden» på raden deres i listen over ansatte på kontoret. Nytt portrett: legg personen inn på nytt, og ta den gamle raden av.'
- name: Vil du endre noe?
description: 'Åpne «Hvordan presenterer du deg?» igjen: kortet ditt er fylt ut med det du har, og det du lagrer erstatter det.'
- name: Se alle ansatte
description: ''
action: /status/ansatte
+12 -12
View File
@@ -1,24 +1,24 @@
followup: false
name: Hvem skal vises på forsiden?
description: ''
name: Hvordan presenterer du deg?
description: Det du skriver her, står på kortet ditt blant menneskene på forsiden.
responsible:
name: Fredrik Borch Lynghaug
contact: fredrik@klingenbergbygg.no
alternatives:
- name: Legg inn en ansatt
description: Navn, rolle, erfaring og portrett. Den ansatte vises på forsiden så snart du sender.
- name: Kortet ditt
description: Rett det du vil og lagre. Du har ett kort, og det du lagrer erstatter det som står der nå.
action: /kontor/ansatt-sent
consequence:
- Legg ut
- Lagre kortet
record_as: ansatte
features:
- name: Hva skjer så
description: Personen vises på forsiden til du tar dem av igjen fra kontoret.
- name: Når du lagrer
description: Kortet ditt på forsiden endres med en gang.
icon: lucide:route
- name: Hvem ser det
description: Alle som besøker siden. Portrettet vises som det er, så velg et bilde du er fornøyd med.
description: Alle som besøker siden. Navnet ditt er det du er logget inn med.
icon: lucide:users
- name: Den ansatte
- name: Kortet ditt
requirements:
- name: name
label: Navn
@@ -31,10 +31,10 @@ alternatives:
- name: erfaring
label: Erfaring
type: textarea
placeholder: Utdanning, fagområder, år i faget, bygg du er stolt av
placeholder: Utdanning, fagområder, bygg du er stolt av. Du kan skrive **fet**, *kursiv*, lister med - og [lenker](https://…).
- name: portrett
label: Portrett
type: file
accept: image/jpeg,image/png,image/webp
placeholder: Et stående bilde, gjerne tatt i dagslys
icon: lucide:user-plus
placeholder: Et stående bilde, gjerne tatt i dagslys. Velger du ikke noe nytt, beholder du det du har.
one_per_person: true
+10
View File
@@ -0,0 +1,10 @@
name: Oppdraget vises nå
description: Det står blant erfaringene på «Hvem består Klingenberg Bygg av?».
alternatives:
- name: Skal det ned igjen?
description: Trykk «Fjern» på raden i listen over erfaringer her på kontoret. Det forsvinner fra listen ti minutter etter.
- name: Se alle erfaringer
description: ''
action: /status/erfaringer
consequence:
- Åpne
+35
View File
@@ -0,0 +1,35 @@
followup: false
name: Hvilket oppdrag vil du vise fram?
description: Det du legger inn her, står blant erfaringene på «Hvem består Klingenberg Bygg av?».
responsible:
name: Fredrik Borch Lynghaug
contact: fredrik@klingenbergbygg.no
alternatives:
- name: Et oppdrag med bilde
description: Et bilde og noen løse ord om hva vi gjorde. Det vises med en gang.
action: /kontor/erfaring-sent
consequence:
- Vis fram
record_as: erfaringer
features:
- name: Når du sender
description: Oppdraget vises blant erfaringene med en gang, til noen på kontoret fjerner det.
icon: lucide:route
- name: Hvem ser det
description: Alle som besøker siden. Skriv ikke noe om kunden de ikke ville lest selv.
icon: lucide:users
- name: Oppdraget
requirements:
- name: tittel
label: Hva var det?
type: text
placeholder: 'For eksempel: Brannstasjonen i Ytre Enebakk'
- name: bilde
label: Bilde
type: file
accept: image/jpeg,image/png,image/webp
placeholder: Et bilde fra oppdraget, gjerne liggende
- name: om
label: Noen ord om det
type: textarea
placeholder: Hva vi gjorde, og hva som var verdt å gjøre skikkelig. **Fet**, *kursiv*, lister og lenker går an.
+25 -3
View File
@@ -5,7 +5,7 @@ responsible:
contact: fredrik@klingenbergbygg.no
alternatives:
- name: Ansatte på forsiden
description: Menneskene slik besøkende ser dem.
description: Menneskene slik besøkende ser dem. Hver retter sitt eget kort; herfra kan et kort tas ned.
action: /kontor
consequence:
- Bekreft
@@ -21,6 +21,23 @@ alternatives:
- from: open
to: sluttet
label: Tatt av forsiden
- name: Erfaringer
description: Oppdragene slik besøkende ser dem.
action: /kontor
consequence:
- Bekreft
features:
- name: Erfaringer
description: Hver rad er ett oppdrag som vises nå.
resource:
source:
kind: kv
bucket: erfaringer
requires_group: kontor
transitions:
- from: open
to: fjernet
label: Fjern
- name: Leverte dokumenter
description: Rapporter, tegninger og vedtak som er sendt til kunder.
action: /kontor
@@ -148,11 +165,16 @@ alternatives:
action: /kontor/leveranse
consequence:
- Ny leveranse
- name: Legg inn en ansatt
description: Navn, rolle, erfaring og portrett, rett ut på forsiden.
- name: Hvordan presenterer du deg?
description: 'Kortet ditt på forsiden: rolle, erfaring og portrett.'
action: /kontor/ansatt
consequence:
- Åpne
- name: Hvilket oppdrag vil du vise fram?
description: Et bilde og noen løse ord, blant erfaringene.
action: /kontor/erfaring
consequence:
- Åpne
- name: Gi en kollega tilgang
description: De får en konto og plass på kontoret, og ser de samme sakene som deg.
action: /kontor
+20
View File
@@ -0,0 +1,20 @@
name: Hva har Klingenberg Bygg gjort?
description: Et utvalg oppdrag, med bilder.
responsible:
name: Fredrik Borch Lynghaug
contact: fredrik@klingenbergbygg.no
alternatives:
- name: Erfaringer
description: ''
features:
- name: Erfaringer
description: Hver rad er én sak og hvor langt den har kommet. Navn og kontaktopplysninger vises ikke her.
resource:
source:
kind: kv
bucket: erfaringer
public: true
states:
- open
empty: Snart viser vi fram oppdrag her.
jq: 'sort_by(.submitted_ms) | reverse | .[] | .responses |= {tittel: .tittel, bilde: .bilde, om: .om}'