Changemkr: fire systemer ble én plattform
Studioets forhold til kunden
Changemkr er en plattform Torn Studio eier en del av. Studioet hadde produktrollen fra januar 2025 til juni 2026 — først som CPO, senere på deltid — og bygde i kodebasen ved siden av rollen. Arbeid etter juni 2026 tilhører andre og står ikke her.
Kort svar
Torn Studio hadde produktrollen i Changemkr og eier en del av plattformen. Fire arvede systemer ble fem driftsatte tjenester rundt én skjemaautoritet på 63 tabeller, og åtte AI-miljøer deler én LangGraph-tjeneste med versjonerte prompter. Siden beskriver arbeidet fram til juni 2026, da studioets periode tok slutt.
Oppdraget
Changemkr trengte én plattform der undersøkelse, analyse, planlegging og oppfølging hang sammen, med AI gjennom hele kjeden. Produkten lå da i fire kodebaser som hadde vokst hver for seg og beskrev de samme begrepene ulikt.
Det som gjorde det vanskelig
- Planleggingshierarkiet lå som sju separate modeller i et Django-API, og det samme ordet betydde ulike ting i de fire systemene — én endring krevde fire inngrep av fire personer som leste modellen ulikt.
- AI-laget snakket sitt eget vokabular, så assistenten foreslo objekter lerretet ikke kunne ta imot. Det var én av to blokkeringer før lansering.
- Databasemodellene i Python-tjenesten ble vedlikeholdt for hånd ved siden av det TypeScript-definerte skjemaet, så de to beskrivelsene av de samme tabellene kunne gli fra hverandre stille.
Tall som lar seg telle
- 4arvede systemer slått sammen
- Migrasjonsrapporten i repoet lister dem én for én, med hva hver eide og hva som erstattet det. Et skript i byggingen holder antallet importer fra dem på null.
- 63tabeller under én autoritet
- Tellbare i skjemakatalogen ved junigrensen. Python-modellene genereres fra den samme definisjonen, og en port feller byggingen når de har glidd fra hverandre.
- 5tjenester i drift
- Web, forretnings-API, AI-tjeneste, administratorkonsoll og en jobbkjører. Alle fem finnes i repoets compose-fil og i infrastrukturkoden for Azure.
- 8AI-miljøer på én tjeneste
- Tellbare i promptregisteret. Hvert miljø bærer sin egen modell, sitt eget verktøysett og sin egen promptversjonering med tilbakestilling i ett klikk.
- 80spesifikasjonsfiler for ende-til-ende-test
- Tellbare i testkatalogen ved junigrensen. Siden siterer antallet filer, fordi repoet selv har trukket tilbake tallet sitt for andel beståtte tester fra den perioden.
Slik ble det gjort
Én skjemaautoritet, resten avledet
Drizzle fikk definere alle 63 tabellene, og modellene i Python-tjenesten genereres fra den samme definisjonen av et skript. En port i byggingen sammenligner det genererte med det innsjekkede og faller ved avvik, så to systemer som beskriver den samme tabellen ulikt lar seg ikke sjekke inn.
Harde domenegrenser
NestJS eier forretningsdata — kontoer, organisasjoner, undersøkelser, planer. Python-tjenesten eier AI-domenet — tråder, innebygginger, minne, supervisoren. Nettappen kaller begge direkte, og grensen står i klartekst i repoets instruksjonsfil, noe som gjør den til en beslutning andre kan følge.
Sju modeller ble én
Planleggingshierarkiet ble lagt om til én tabell med en typediskriminator, pluss en tabell for nøkkelresultater og en for relasjoner. Vokabularet ble lukket, og AI-laget fikk snakke nøyaktig de ordene lerretet bruker. Blokkeringen som gjaldt det, ble lukket den tiende juni 2026.
Porter bærer grensene
Et skript holder antallet importer fra de arvede systemene på null og feller byggingen ved første tilbakefall. Et annet feller skjemaet når de genererte modellene har glidd. Konsolideringen holder fordi den kontrolleres ved hver endring.
Organisasjonens egne data i prompten
Undersøkelsesresultater, svake motorer og organisasjonsprofil injiseres nå i systemprompten for miljøene som trenger dem. Tidligere lå informasjonen bak verktøy modellen selv måtte velge å kalle, noe den iblant lot være.
Teknologi
- NestJS
- FastAPI
- Next.js
- Drizzle ORM
- SQLAlchemy
- LangGraph
- PostgreSQL
- pgvector
- BullMQ
- Azure Container Apps
Hva beviset rekker til
Dette viser at fire systemer lar seg slå sammen til ett og holdes sammen av porter. Det viser ingenting om et marked: plattformen var ikke lansert ved junigrensen, verdikten i repoets egen beredskapslogg var driftsettbar med gjenstående punkter, og ett av dem var en manuell sikkerhetsoppgave ingen kode lukker.
Grunnlag
Hva denne artikkelen hviler på — en måling vi gjorde, en datert kilde eller en beslutning vi tok og hva den kostet.
- Måling
Hvor mange tabeller den ene skjemaautoriteten definerer
Måleobjekt: Changemkrs skjemakatalog ved junigrensen
Metode: Tell kallene til pgTable i packages/database/src på siste innsjekking i juni 2026.
Resultat: 63 tabeller
- Beslutning
La ett skjema definere hver tabell og generere modellene i Python-tjenesten fra det.
Hva det kostet: Hver skjemaendring krever nå et ekstra genereringssteg før den kan sjekkes inn, og en håndredigert modell feller byggingen selv når den er riktig.
- Beslutning
Legg sju modeller for planleggingshierarkiet i én tabell med en typediskriminator.
Hva det kostet: Databasen kan ikke lenger skille objekttypene med egne kolonner, så reglene for hva som får ligge hvor flyttet opp i applikasjonen og trenger egne tester.
Vanlige spørsmål
- Er Changemkr en kunde av Torn Studio?
- Studioet eier en del av plattformen og hadde produktrollen der, noe som står øverst på siden. Forskjellen betyr noe: et oppdrag for noen andre og et produkt studioet er med på å eie er ulike påstander, og leseren skal vite hvilket det er før resultatene.
- Hvorfor slutter caset i juni 2026?
- Studioets produktrolle løp til da. Plattformen har blitt utviklet videre etterpå av andre, og å regne med det arbeidet ville være å ta æren for noen andres. Hvert tall på siden er målt ved den grensen og lar seg kontrollere der.
- Hvorfor står det ikke noe tall på hvor mange tester som gikk gjennom?
- Repoet målte testsuiten sin på nytt i august 2026 og trakk tilbake det tidligere tallet som ugyldig. Et tall kilden selv har trukket tilbake hører ikke hjemme her, så siden siterer det som var stabilt ved grensen: tabeller, tjenester, AI-miljøer og testfiler.
- Hva betyr én skjemaautoritet i praksis?
- At én definisjon holder alle 63 tabellene og at alt annet avledes fra den. Modellene i Python-tjenesten genereres av et skript, og en port feller byggingen når det genererte og det innsjekkede har glidd fra hverandre. To systemer som beskriver samme tabell ulikt blir umulig å sjekke inn.
- Hvor stor del av koden skrev studioet?
- Studioet bygde store deler av produktet i perioden og formulerte mesteparten av ideene og funksjonene, samtidig som andre også arbeidet i kodebasen. Siden påstår derfor en rolle og en periode, og tallene beskriver det leverte systemet ved grensen.
- Kan et slikt arbeid kjøpes av studioet?
- Ja, i to former. Konsolidering og AI-integrasjon ligger under AI og automatisering, og produktrollen — beslutningsgrunnlag, prioritering, arkitekturvalg — ligger under Product Management. Et oppdrag begynner med en gjennomgang til fast pris før noe bygges.
Fortell hva du vil bygge
Tretti minutter, kostnadsfritt, og et ærlig svar på om vi er riktig studio for oppdraget.
Svar innen et døgn, et skriftlig forslag med fast pris innen tre dager, og du bestemmer deg i ro og mak.
Fornøydgaranti