STUDIO T / TEKNISK GRANSKNING / 23. OKTOBER 2026
God pilot. Flere steg før lansering.
Gjennomgang av kildekode, databaser, økonomiflyt, skriveragent og offisiell integrasjonsdokumentasjon. Brukt’n er pilotbutikk for en fremtidig plattform for flere bruktbutikker.
Hovedkonklusjon
Dagens backend er en enkeltbutikkpilot med reell serverkontroll, krypterte betalingsprofiler og låste økonomiske dokumenter. Den nye demoen viser hvordan flere butikker, Studio T-administrasjon og nettbutikktillegg kan fungere. Demoen gjør ikke backend klar for flere butikker, og simulerte tilkoblinger er ikke ekte leverandørintegrasjoner.
Utseendet kan beholdes. Det viktigste arbeidet ligger i datamodell, tilgang, avstemming og drift. Vanlig kundeinnlogging bør være på plass før Brukt’n inviterer ekte kunder.
Dette bør vi beholde
- Serverstyrte roller og kundeavgrensing.
- Heltallsøre, låste oppgjør og dokumenthistorikk.
- Revisjonskontroll og atomisk hylletildeling.
- Maskert konto og kryptering med butikk-/kundekontekst.
- Utskriftskø som krever kontroll ved uviss fysisk utskrift.
- Designet og de separate arbeidsområdene.
Avgrens første nettbutikkversjon
La hver butikk ha egen nettbutikk, Stripe-konto og fraktavtale. Start med én butikk per handlekurv. Kundens tillegg kan prises per måned og må bestilles frivillig. 49 kr per måned i demoen er et forslag, ikke en fastsatt pris.
Butikkens avtalemessige rolle ved salget må avklares: selger eller formidler, ansvar for retur, reklamasjon, betaling og utbetaling til vareeier. Dette kan ikke avgjøres bare ved valg av Stripe-oppsett.
Ny økonomiversjon
Varig databasejournal for arbeidsområde og fakturabok, manuelle utbetalingsregistreringer med motposter, utskrivbare måneds- og årsoppgjør, og arkiverte rapportversjoner med kilderevisjoner. Journalen lagres atomisk med endringen. Eldre data får startpunkt i journalen ved første endring; tidligere brukerhistorikk kan ikke rekonstrueres.
Vernet gjelder applikasjons- og databaseoperasjoner, ikke en fullmektig databaseadministrator. Sikkerhetskopi, gjenoppretting, oppbevaringssted og full drifts-/tilgangslogging er fortsatt åpne punkter.
Prøv journal og årsoppgjør →Funn og forbedringer
01 / Før nettbutikk lanseres
Tilleggspakke og ordreansvar
Funnet: Butikkpakken kan slås av/på i demo. Leietaker velger egen sending eller butikkpakking. Ordre beholder avtalt ansvar, gebyr og frist. Butikkens plukking, pakking, sporing, henting og gebyrgrunnlag er demonstrert.
Tiltak: Flytt til varige, butikkavgrensede serverdata. Bygg varsling, refusjon og gebyrmotposter, leverandørkoblinger og avtaleflyt. Pris for butikkpakken er ikke fastsatt. Hold separat fra leietakertillegg og pakkegebyr.
Kodegrunnlag: lib/fulfillment-demo.mjs; app/demo/ordre/page.tsx02 / Før fysisk returpilot
Returkontroll
Funnet: Refusjon setter varen til returkontroll. Salg og etiketter er sperret til butikkadmin bekrefter kontroll. Ny tilgjengelig vare får ny etikettversjon.
Tiltak: Test fysisk rutine. Tidligere refunderte varer må gjennomgås særskilt; gamle hendelser er ikke omskrevet. Delreturer og nettrefusjoner gjenstår.
Kodegrunnlag: lib/domain.mjs; app/api/workspace/route.ts03 / Må løses før flere butikker
Butikkavgrensing
Funnet: memberships.user_id er global primærnøkkel. applications.user_id er globalt unik. shop() krever én utviklerbutikk.
Tiltak: Innfør butikker, personer, butikkmedlemskap og leieavtaler som separate tabeller. Samme kunde skal kunne ha hylle i flere butikker. Butikk-ID må valideres på serveren i alle lesinger og endringer.
Kodegrunnlag: db/schema.ts; app/api/applications/route.ts04 / Må løses før flere butikker
Studio T-administrator
Funnet: Utviklerrollen er i dag knyttet til én butikk. Den har ikke global oversikt og kan ikke lese private betalingsprofiler.
Tiltak: Egen plattformrolle for studiot med tofaktor, butikkoversikt, funksjonsstyring og begrunnet supporttilgang. Logg alle innsyn og endringer. Selv superadmin må korrigere regnskap med sporbare motposter.
Kodegrunnlag: lib/server-access.ts; lib/access.mjs05 / Må løses før ekte kunder
Innlogging
Funnet: Identitet kommer fra Sites-headere. Vanlig passordinnlogging, e-postverifisering, passordreset og MFA er ikke implementert.
Tiltak: Velg produksjonsdrift og en etablert identitetsleverandør. Bruk e-post som verifisert kontakt og eventuelt selvvalgt brukernavn. Ingen delte ansattepassord. Krev MFA for butikkadmin og Studio T. Ikke flytt tilliten til Sites-headere uendret til egen server.
Kodegrunnlag: lib/security.mjs; app/chatgpt-auth.ts06 / Må løses før ekte salg
Zettle
Funnet: Adapteren henter og inspiserer kjøp, men er ikke tilkoblet. Det finnes ingen ferdig OAuth-, produkt-, lager- eller webhook-flyt.
Tiltak: Partnerintegrasjon med godkjenning fra hver butikk. Kartlegg produkt/variant/strekkode, hent salg og returer idempotent, håndter rabatter og delreturer, og kjør avstemming. Varesynk og betalingsdata er ulike flyter.
Kodegrunnlag: lib/zettle.mjs07 / Må løses før ekte salg
Nett og kasse samtidig
Funnet: Dagens varemodell har available/sold/return_review/withdrawn. Intern revisjonskontroll stopper ikke et eksternt Zettle-salg.
Tiltak: Atomisk reservasjon med utløp, betalingsbekreftelse fra signert webhook og konfliktkø. Ikke lov at Zettle hindrer en skanning eller et offline-salg. Unike varer må ha en praktisk rutine for reservasjon også i butikken.
Kodegrunnlag: lib/domain.mjs; lib/platform-demo.mjs08 / Må løses før ekte utbetaling
Oppgjør og utbetalingsjournal
Funnet: Nå finnes append-only databasejournal, manuelle utbetalingsposter med bankreferanse og motposter, måneds-/årsrapport og uforanderlige rapportversjoner. Ingen bankkobling eller kontrollert betalingsbatch er implementert.
Tiltak: Samlet reskontro for salg, leie, tillegg, returer, motregning og utbetaling. Utbetalingsbatch trenger stabil ID, godkjenning, bankreferanse og sperre mot dobbeltbetaling. Kontroller oppgjør med regnskapsfører før piloten bruker penger.
Kodegrunnlag: lib/finance.mjs; app/api/finance/route.ts; drizzle/0003_glossy_the_hunter.sql; drizzle/0004_shocking_sprite.sql09 / Må løses før ordinær fakturering
Faktura og avgifter
Funnet: Full kreditering støttes. Delkreditering, erstatningsfaktura, netto returer, overbetaling og leiedokument når salget dekker leien mangler.
Tiltak: Utvid bilags- og kundejournalen, med uforanderlige originaler. Skill MVA-registrering fra avgiftskategori, avklar bruktvaresalg/formidling og ansvar. Ny versjon beholder betalings-ID ved retry og lagrer fakturahistorikk atomisk med fakturaboken. Full reskontro og avgiftskontroll gjenstår.
Kodegrunnlag: lib/billing.mjs; app/api/billing/route.ts10 / Må løses før nettbutikk
Bilder og publisering
Funnet: Ingen varig bildeopplasting eller objektlagring er koblet til; hostingmanifestet har r2:null.
Tiltak: Eier- og butikkavgrenset objektlagring. Valider faktisk filinnhold, størrelse og pikselantall; dekod og fjern metadata som GPS. Lag miniatyrer og sletterutiner. Godkjenn varetekst, bilder og pakkemål før publisering.
Kodegrunnlag: .openai/hosting.json; app/platform-demo.tsx11 / Må løses før nettbutikk
Stripe, frakt og abonnement
Funnet: Ingen Stripe- eller Profrakt-nøkkel, webhook, checkout eller fraktbooking er aktivert. Demoen bruker faste eksempelpriser.
Tiltak: Egen Stripe Connect-konto og Profrakt-avtale per butikk. Skilj varesalg, frakt, betalingsgebyrer, kundens nettbutikktillegg og Studio T-abonnement. Nettbutikktillegg må ha avtale, betalingsperiode, oppsigelse og serverstyrt rettighet.
Kodegrunnlag: app/platform-demo.tsx; lib/platform-demo.mjs12 / Før fysisk pilot
Skriver og enhetsregister
Funnet: OBA list_printservere viste Pi Skien online 23.10.2026. Modell og driver ble ikke returnert. HylleutleieNO har én global enhetsnøkkel og hardkodet butikktekst.
Tiltak: Bekreft eksakt Brother-modell, rull og dagens OBA-agent med Pål. Opprett eget enhetsregister, kø og tilbakekallbar nøkkel for hver butikk. Kalibrer og skann fysisk. Fraktetiketter kan kreve annet format eller egen skriver.
Kodegrunnlag: printer/agent.py; app/api/print/route.ts13 / Før fysisk pilot
Sen skriverkvittering
Funnet: En kansellert jobb kunne avvise en sen kvittering permanent og blokkere alle etterfølgende jobber i Pi-agenten.
Tiltak: Gi et eksplisitt terminalt svar for manuelt avsluttet jobb. Håndter kvitteringsfeil per jobb uten automatisk ny fysisk utskrift. Test strømbrudd, tom rull og manuell lukking.
Kodegrunnlag: printer/agent.py; app/api/print/route.ts14 / Før butikkpiloten utvides
Hylleleie og kundeadmin
Funnet: Aktive hyller frigjøres ikke ved utløp. Forlengelse, hyllebytte, flere hyller, restvarer og gjenåpnet søknad mangler.
Tiltak: Egen leieavtale per hylle med start, slutt, prisversjon og avslutning. Frigi først etter varekontroll og sluttoppgjør. Tillat ny søknad/reaktivering med historikk. Prisendring på vare må utløse ny etikettversjon.
Kodegrunnlag: lib/domain.mjs; lib/waitlist.mjs; app/api/access/route.ts15 / Før butikkpiloten utvides
Tilbakestilling av testdata
Funnet: API og database blokkerer sletting av workspaces/fakturabøker. Historikk og rapportarkiv er append-only. Lokal nettleserdemo kan fortsatt nullstilles.
Tiltak: Etabler dokumentert arkiv- og sletterutine per datakategori. Separat testmiljø må ha styrt levetid. Ikke omgå journalvernet for å nullstille en butikk.
Kodegrunnlag: app/api/workspace/route.ts16 / Før produksjon
Drift, personvern og skalering
Funnet: Globale pilot/live-flagg og JSON-snapshots på 2,5/3 MB. Økonomijournalen er nå varig, men tar kopi av hele revisjoner og må skaleres om. Backup, restore, nøkkelrotasjon og reell flerbrukertest er ikke gjennomført.
Tiltak: Butikkvise miljøgrenser, normaliserte tabeller, append-only logg, overvåking, ratebegrensning og testet gjenoppretting. Avklar avtalepart, behandlingsansvar, databehandlere, lagringstid og netthandelsvilkår.
Kodegrunnlag: app/api/workspace/route.ts; app/api/billing/route.ts; docs/production-readiness.mdPrioritert gjennomføring og akseptanse
1. Plattform og innlogging
Velg produksjonsdrift og identitet. Bygg butikker, medlemskap, leieavtaler og Studio T-rolle. Test tre ekte roller, samme kunde i to butikker og avvisning av alle forsøk på tilgang mellom butikkene.
2. Brukt’n som kontrollert butikkpilot
Koble Brukt’ns egen Zettle-konto og en separat Pi/Brother-enhet. Følg vare fra registrering til skannet etikett, testsalg, retur, oppgjør, faktura/utbetaling og avsluttet leie. Avstem beløpene med butikkens faktiske data.
3. Nettbutikk som betalt tillegg
Valgfri betalt pakke per butikk, utvikles etter grunnpakken. Pakkepris avtales senere. Aktiver bilder og godkjenning. Kjør Stripe i testmodus og Profrakt i sandbox. Test samtidige salg, avbrutt betaling, dupliserte webhooks, refusjon, fraktdifferanse og dobbeltbooking. Én butikk per handlekurv i første versjon.
4. Begrenset lansering
Verifiser backup/restore og hendelseshåndtering. Ferdigstill avtaler og personvern. Inviter neste butikk først når alle blokkeringer er lukket. Mål pilotfeil og rett dem før offentlig registrering.
Hva vi trenger for virkelige tilkoblinger
- Bekreftet Brother-modell og etikettformat, samt OBA-agentens oppsett fra Pål. OBA MCP viste bare Pi Skien og online-status. Ingen utskrift er sendt.
- Zettle-utviklerapp og butikkens autorisasjon. Flere butikker krever butikkvis OAuth og tokenhåndtering.
- Stripe Connect-oppsett for Studio T-plattformen og tilkoblet konto for pilotbutikken.
- Profrakt sandbox/API-tilgang og butikkens fraktavtale. Ikke bruk OBA-avtalen automatisk for andre butikker.
- Valgt drifts- og innloggingsleverandør, verifisert e-post til Studio T og sikker kontooppretting. Brukernavnet studiot vises bare i innloggingsdemoen. Ingen passord er lagret og ingen ny konto er opprettet.
Kilder og kontrollgrunnlag
Kildekode ved start: 2096aebaf365857663da48d765214a788d50e916. Offisiell dokumentasjon kontrollert 23.10.2026. OBA skriverstatus lest via obaverk9800. Det er ikke gjort endringer hos OBA, Zettle, Stripe eller Profrakt.