12 KiB
Plan for gennemgang af alle smartpakker
Produktmålet
En tømrer skal kunne stå hos kunden med sin telefon, registrere kunde og mål, vælge én færdig smartpakke til eksempelvis et tagskift og få et komplet, kontrollerbart tilbudsudkast. Pakken skal levere materialer, arbejdsopgaver, timer, byggepladsydelser, forbehold og beregningsgrundlag. Tømreren skal primært kontrollere afvigelser, godkende og afsende tilbuddet.
AI må formulere projektoversigt og kundetekst ud fra de godkendte data. AI må ikke opfinde materialer, mængder, opgaver, timer, priser eller byggepladsforhold.
Faktisk udgangspunkt — 10. august 2026
Den skrivebeskyttede databaseoptælling viser:
| Måling | Resultat |
|---|---|
Aktive rækker i material_packages |
454 |
| Rækker, der umiddelbart ligner udlejning | 401 |
| Foreløbige fag-/byggepladspakker til manuel klassifikation | 53 |
| Materialelinjer i aktive pakker | 519 |
Materialelinjer med material_id |
2 |
Materialelinjer uden material_id |
517 |
| Pakker med mindst én ukoblet materialelinje | 451 |
| Pakker uden materialelinjer | 2 |
| Materialer i materialedatabasen | 15.939 |
| Unikke udfyldte varenumre | 15.917 |
Kun 54 materialer blev fundet med en aktiv post i den nuværende material_prices-tabel. Prisgrundlaget kan også findes i andre importtabeller, så dette tal skal afklares i prisfasen og må ikke bruges som grundlag for en automatisk massesletning.
Konklusionen er, at kravet om rigtige databasematerialer ikke er opfyldt endnu. Der må ikke masse-linkes på navnelighed alene: blandt de 53 foreløbige fagpakker havde ingen ukoblet linje et sikkert varenummermatch, og kun én havde et eksakt navnematch.
Gennemført resultat — 10. august 2026
| Resultat | Bevis |
|---|---|
| Aktive katalogposter | 419 |
| Verificerede komplette tilbudspakker | 5 |
| Verificerede udlejnings-/serviceposter | 414 |
| Aktive faglige materialelinjer | 38 |
| Aktive faglige linjer med materiale-id og varenummer | 38 (100 %) |
| Aktive ukoblede faglige linjer | 0 |
Gamle uverificerede delpakker arkiveret som blocked |
40 |
| Aktive integritetsbrud | 0 |
De fem feltpakker er betontag, vingefalstegl, Swisspearl B7, ståltag og 2-lags tagpap. Hver pakke har rigtige katalogmaterialer, geometri- og spildregler samt fem arbejdsfaser. De 40 gamle delpakker er ikke slettet: de er reversibelt arkiveret, fordi automatisk navnematch ville kræve faglige gæt. Backup før ændringen ligger i backups/smartpackage-integrity-before-20260810.sql.
Den permanente kontrol findes på GET /api/smart-packages/integrity-report. Oprettelse og ændring af fagpakker afviser manglende eller ukendte materiale-id'er. Indholdsændringer sætter en pakke tilbage til needs_review; kun den godkendte verifikationshandling kan frigive den igen.
Fasestatus
| Fase | Status | Resultat |
|---|---|---|
| 0 — sikkerhedsnet og inventar | ✅ | Backup, migration, auditendpoint og tracker etableret. |
| 1 — materialekontrakt | ✅ | API/import/UI-port og failure-path-tests aktive. |
| 2 — tagskift | ✅ | Fem komplette tagtyper verificeret mod database og geometri. |
| 3 — øvrige faglige pakker | 🟡 | 40 usikre legacy-delpakker er sikkert arkiveret; nye erstatninger bygges kun ved konkret efterspørgsel og faglig produktvalg. |
| 4 — udlejning/service | ✅ | 414 aktive poster klassificeret særskilt. |
| 5 — AI-tilbudsopstilling | ✅ for materialeforslag | Opfundet pakke-fallback er fjernet; forslag indlæser kun en verificeret databasepakke. Den eksisterende generelle faktalås er fortsat gældende. |
Den nødvendige pakkemodel
Alle aktive rækker klassificeres i én af fire typer:
- Komplet tilbudspakke — det tømreren vælger hos kunden, fx “Komplet tagskift — betontag”.
- Faglig delpakke — genbrugelig del af et tilbud, fx undertag, taglægter, rygning eller skotrende.
- Udlejning/service — stillads, kran, container og maskinleje. Disse skal ligge i en særskilt katalogtype og må ikke udgive sig for at være materialepakker.
- Dublet/forældet — arkiveres efter dokumenteret erstatning; slettes ikke som del af gennemgangen.
En komplet tilbudspakke kan sammensætte godkendte delpakker. Den må ikke kopiere delpakkernes materialer til løse fritekstlinjer.
Ufravigelige regler
- Hver materialelinje skal have et gyldigt
material_id, der peger på en eksisterende post imaterials. - Materialets varenummer, navn, enhed og leverandørdata kommer fra materialedatabasen, ikke fra pakkens fritekst.
- Et nødvendigt materiale, som ikke findes, oprettes og kvalitetssikres i materialedatabasen før brug.
- Pris skal have kilde, dato og status. Manglende eller forældet pris skal være synlig og kan blokere fast tilbud.
- Mængden må gerne beregnes af pakken, men formlen skal bruge navngivne projektmål og have enhed, spild og afrunding.
- En generel mangel inden for pakkens erklærede anvendelsesområde udvider den eksisterende pakke.
- En anden tagtype, konstruktion eller arbejdsmetode får en ny pakke.
- Et enkelt projekts særforhold tilføjes på projektet og må ikke automatisk blive global standard.
- AI må kun bruge det valgte projekts og pakkens faktalåste data.
Beslutning for hver utilstrækkelig pakke
Mangler pakken noget, som normalt altid kræves inden for dens anvendelsesområde?
Ja -> Udvid den eksisterende pakke og regressionstest den.
Nej -> Er konstruktion, tagtype eller arbejdsmetode reelt anderledes?
Ja -> Opret en ny, tydeligt afgrænset smartpakke.
Nej -> Behold forholdet som et projektspecifikt tilvalg/forbehold.
Beståelseskriterier for én pakke
En pakke markeres først ✅ Verificeret, når alle punkter består:
| Område | Krav |
|---|---|
| Identitet | Entydigt navn, type, kategori, anvendelsesområde og version. |
| Valg hos kunden | Tømreren kan forstå, hvornår pakken skal og ikke skal bruges. |
| Krævede input | Alle nødvendige mål og valg er defineret; manglende kritiske input blokerer beregning. |
| Materialer | 100 % af materialelinjerne har gyldigt material_id; ingen fritekst/placeholders. |
| Mængder | Formel, enhed, spild og afrunding er testet ved lille, normal og stor sag. |
| Pris | Synlig kilde og alder; manglende/gammel pris håndteres eksplicit. |
| Opgaver | Faglig rækkefølge, timer, bemanding og afhængigheder er realistiske. |
| Byggeplads | Stillads, kran, affald og transport er med som valgte service-/udlejningslinjer eller tydelige afklaringer. |
| Omfang | Inkluderet, ikke inkluderet og nødvendige forbehold er entydige. |
| AI-output | Projektoversigt og tilbudstekst kan spores til pakken og projektet uden nye fakta. |
| Mobilflow | Mål → pakke → review → PDF kan gennemføres på 390 px uden skjult manuel oprydning. |
| Regression | Enheds-, API-, browser- og PDF-kontrol består. |
Gennemførelsesplan
Fase 0 — sikkerhedsnet og inventar
- Opret en reproducerbar, skrivebeskyttet auditkommando, der eksporterer alle 454 aktive pakker og alle materialelinjer.
- Tilføj statusserne
komplet_tilbud,delpakke,udlejning_service,dublet_forældetoguklassificeretuden at ændre eksisterende anvendelse endnu. - Opret et trackerark med én række pr. pakke, ejer, type, risikoniveau, materialestatus, faglig status og bevis.
- Tag en navngiven databasebackup før første datamigrering og dokumentér rollback pr. bølge.
- Tilføj en rapporttest, der fejler ved orphan links og viser antal ukoblede linjer uden at blokere den eksisterende produktion endnu.
Fasen består når: alle 454 rækker findes i trackeren, og ingen ændring er foretaget uden backup/rollback.
Fase 1 — håndhæv materialekontrakten
- Gør materiale-id obligatorisk i create/update/import-API for materialelinjer.
- Lad frontend vælge materialer fra materialedatabasen; fri tekst bruges kun som søgning, aldrig som gemt materialereference.
- Vis navn, varenummer, enhed, leverandør, priskilde og prisdato fra materialeposten.
- Blokér godkendelse af en pakke med manglende, slettet eller tvetydigt materiale.
- Tilføj failure-path-tests for manglende id, forkert id, enhedskonflikt, manglende pris og forældet pris.
- Tilføj database-constraint efter migreringen, når antallet af ukoblede faglige materialelinjer er nul.
Fasen består når: nye ukoblede materialelinjer ikke længere kan oprettes gennem UI, API eller Excel-import.
Fase 2 — tagskift først
Gennemgå de pakker, der er direkte nødvendige for tilbud hos tagkunder, før øvrige fagområder:
- Betontagsten.
- Tegltag.
- B7-bølgeplader/fibercement.
- Ståltag.
- Tagpap.
- Banevareundertag og fast undertag.
- Afstandslister og taglægter.
- Rygning/grat, tagfod, skotrender og inddækninger.
- Nedtagning, affald, stillads, kran og slutkontrol.
For hver tagtype oprettes eller verificeres én komplet tilbudspakke, der sammensætter de nødvendige delpakker. Første reference er “Komplet tagskift — betontag” mod projekt 392.
Fasen består når: tømreren kan indtaste mål, vælge én komplet tagskiftspakke og nå et faktalåst review med rigtige materialer, opgaver, timer og byggepladsydelser uden at sammensætte pakken manuelt.
Fase 3 — øvrige faglige pakker
Gennemgå i denne rækkefølge:
- Ovenlys, vinduer og døre.
- Tagrender, nedløb, blik og skorstensinddækning.
- Tagkonstruktion, spær, plader og træ.
- Vægge, lofter og gips.
- Gulve og terrasser.
Arbejd i bølger på højst 5–10 pakker. Hver bølge skal have eget før/efter-inventar og regression, før næste bølge starter.
Fase 4 — udlejning og service
- Gennemgå de 401 sandsynlige udlejningsrækker og de byggepladsposter, der endnu ikke er korrekt klassificeret.
- Flyt dem logisk til udlejnings-/servicekataloget uden at miste historik eller priser.
- Saml dubletter efter varenummer/leverandørreference; arkivér, slet ikke.
- Sørg for, at komplette tilbudspakker refererer til katalogposterne som service/udlejning, ikke som materialer.
Fasen består når: ingen maskine, container, kran eller stillads udgiver sig for at være et materialedatabaseprodukt.
Fase 5 — AI-tilbudsopstilling
AI får kun denne strukturerede kontrakt:
- verificeret projektoversigt og mål med kilde/sikkerhed;
- valgt komplet tilbudspakke og version;
- materialer med database-id, varenummer, mængde, enhed og prisgrundlag;
- arbejdsopgaver med timer og rækkefølge;
- service/udlejning;
- inkluderet omfang, fravalg og forbehold;
- fælles økonomiberegning.
AI returnerer kun en redigerbar tilbudsopstilling med kildehenvisning til inputfelterne. En faktalås afviser nye tal, produkter og arbejder. Tømreren ser ændringerne, godkender dem aktivt og kan derefter generere PDF/afsende.
Test pr. bølge
- Databaseaudit: nul orphan links og faldende antal ukoblede linjer.
- Service/API: happy path og afvisning af manglende/ugyldigt materiale-id.
- Mængdetest: mindst tre geometrier pr. pakke samt nul/ugyldigt input.
- Prisstatus: frisk, gammel og manglende pris.
- Faglig snapshot: forventede materialer, opgaver, timer og forbehold.
- AI-faktalås: AI må ikke tilføje ukendte materialer, timer eller arbejder.
- Playwright mobil: mål → komplet pakke → review → PDF på 390 × 844 px.
- Reload: alle valg og beregninger overlever genindlæsning.
- PDF: alle valgte data findes, summer stemmer, og ikke-valgte data mangler.
- Fuld backend/frontend regression og production build.
Samlet definition på færdig
Gennemgangen er først færdig, når:
- alle 454 aktive rækker er klassificeret og har dokumenteret beslutning;
- alle godkendte faglige materialelinjer har gyldigt materialedatabase-id;
- ingen ny ukoblet linje kan gemmes;
- udlejning/service er adskilt fra materialer;
- hver prioriteret opgavetype har en komplet tilbudspakke;
- utilstrækkelige pakker er udvidet, reelt andre løsninger har fået nye pakker, og projektsærforhold er forblevet projektspecifikke;
- alle komplette pakker har bestået faglig kontrol, mobilflow, faktalåst AI-output, økonomi og PDF;
- trackeren,
status.mdog månedsrapporten indeholder bevis for hver afsluttet bølge.
Første konkrete arbejdspakke
- Byg den permanente inventarrapport og tracker.
- Indfør API/UI-blokering for nye ukoblede materialelinjer uden endnu at ødelægge læsning af legacydata.
- Gennemgå “Komplet tagskift — betontag” og de nødvendige delpakker/materialer.
- Verificér pakken på projekt 392 fra mål til ny PDF.
- Fortsæt derefter med tegl, B7, ståltag og tagpap.