Files
tilbudgivern/docs/plans/SMARTPAKKE_TOTALGENNEMGANG.md
2026-08-10 12:38:52 +02:00

12 KiB
Raw Blame History

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:

  1. Komplet tilbudspakke — det tømreren vælger hos kunden, fx “Komplet tagskift — betontag”.
  2. Faglig delpakke — genbrugelig del af et tilbud, fx undertag, taglægter, rygning eller skotrende.
  3. 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.
  4. 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 i materials.
  • 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

  1. Opret en reproducerbar, skrivebeskyttet auditkommando, der eksporterer alle 454 aktive pakker og alle materialelinjer.
  2. Tilføj statusserne komplet_tilbud, delpakke, udlejning_service, dublet_forældet og uklassificeret uden at ændre eksisterende anvendelse endnu.
  3. Opret et trackerark med én række pr. pakke, ejer, type, risikoniveau, materialestatus, faglig status og bevis.
  4. Tag en navngiven databasebackup før første datamigrering og dokumentér rollback pr. bølge.
  5. 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

  1. Gør materiale-id obligatorisk i create/update/import-API for materialelinjer.
  2. Lad frontend vælge materialer fra materialedatabasen; fri tekst bruges kun som søgning, aldrig som gemt materialereference.
  3. Vis navn, varenummer, enhed, leverandør, priskilde og prisdato fra materialeposten.
  4. Blokér godkendelse af en pakke med manglende, slettet eller tvetydigt materiale.
  5. Tilføj failure-path-tests for manglende id, forkert id, enhedskonflikt, manglende pris og forældet pris.
  6. 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:

  1. Betontagsten.
  2. Tegltag.
  3. B7-bølgeplader/fibercement.
  4. Ståltag.
  5. Tagpap.
  6. Banevareundertag og fast undertag.
  7. Afstandslister og taglægter.
  8. Rygning/grat, tagfod, skotrender og inddækninger.
  9. 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:

  1. Ovenlys, vinduer og døre.
  2. Tagrender, nedløb, blik og skorstensinddækning.
  3. Tagkonstruktion, spær, plader og træ.
  4. Vægge, lofter og gips.
  5. Gulve og terrasser.

Arbejd i bølger på højst 510 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

  1. Gennemgå de 401 sandsynlige udlejningsrækker og de byggepladsposter, der endnu ikke er korrekt klassificeret.
  2. Flyt dem logisk til udlejnings-/servicekataloget uden at miste historik eller priser.
  3. Saml dubletter efter varenummer/leverandørreference; arkivér, slet ikke.
  4. 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

  1. Databaseaudit: nul orphan links og faldende antal ukoblede linjer.
  2. Service/API: happy path og afvisning af manglende/ugyldigt materiale-id.
  3. Mængdetest: mindst tre geometrier pr. pakke samt nul/ugyldigt input.
  4. Prisstatus: frisk, gammel og manglende pris.
  5. Faglig snapshot: forventede materialer, opgaver, timer og forbehold.
  6. AI-faktalås: AI må ikke tilføje ukendte materialer, timer eller arbejder.
  7. Playwright mobil: mål → komplet pakke → review → PDF på 390 × 844 px.
  8. Reload: alle valg og beregninger overlever genindlæsning.
  9. PDF: alle valgte data findes, summer stemmer, og ikke-valgte data mangler.
  10. 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.md og månedsrapporten indeholder bevis for hver afsluttet bølge.

Første konkrete arbejdspakke

  1. Byg den permanente inventarrapport og tracker.
  2. Indfør API/UI-blokering for nye ukoblede materialelinjer uden endnu at ødelægge læsning af legacydata.
  3. Gennemgå “Komplet tagskift — betontag” og de nødvendige delpakker/materialer.
  4. Verificér pakken på projekt 392 fra mål til ny PDF.
  5. Fortsæt derefter med tegl, B7, ståltag og tagpap.