Changemkr: fyra system blev en plattform
Studions relation till kunden
Changemkr är en plattform Torn Studio äger en del av. Studion hade produktrollen från januari 2025 till juni 2026 — först som CPO, därefter på deltid — och byggde i kodbasen parallellt med rollen. Arbete efter juni 2026 ligger hos andra och står inte här.
Kort svar
Torn Studio hade produktrollen i Changemkr och äger en del av plattformen. Fyra ärvda system slogs ihop till fem driftsatta tjänster kring en schemaauktoritet på 63 tabeller, och åtta AI-miljöer delar en LangGraph-tjänst med versionerade prompter. Sidan beskriver arbetet fram till juni 2026, då studions period tog slut.
Uppdraget
Changemkr behövde en plattform där enkät, analys, planering och uppföljning hängde ihop, med AI genom hela kedjan. Produkten fanns då i fyra kodbaser som hade växt var för sig och beskrev samma begrepp olika.
Det som gjorde det svårt
- Planeringshierarkin fanns som sju separata modeller i ett Django-API, och samma begrepp betydde olika saker i de fyra systemen — en ändring krävde fyra ingrepp av fyra personer som läste modellen olika.
- AI-lagret talade sin egen vokabulär, vilket gjorde att assistenten föreslog objekt som duken inte kunde ta emot. Det var en av två blockerare före lansering.
- Python-tjänstens databasmodeller underhölls för hand vid sidan av det TypeScript-definierade schemat, så de två beskrivningarna av samma tabeller kunde glida isär tyst.
Siffror som går att räkna efter
- 4ärvda system som slogs ihop
- Migrationsrapporten i repot listar dem en och en med vad de ägde och vad som ersatte dem. Ett skript i bygget håller antalet importer från dem på noll.
- 63tabeller under en auktoritet
- Räknebara i schemakatalogen vid junigränsen. Python-modellerna genereras ur samma definition, och en grind fäller bygget när de har glidit isär.
- 5tjänster i drift
- Webb, affärs-API, AI-tjänst, administratörskonsol och en jobbkörare. Samtliga finns i repots compose-fil och i infrastrukturkoden för Azure.
- 8AI-miljöer på en tjänst
- Räknebara i promptregistret. Varje miljö bär egen modell, egna verktyg och egen promptversionering med återställning i ett klick.
- 80specfiler för end-to-end-test
- Räknebara i testkatalogen vid junigränsen. Sidan citerar antalet filer, eftersom repot självt har dragit tillbaka sin dåvarande siffra för andel godkända test.
Så gjordes det
En schemaauktoritet, resten härlett
Drizzle fick definiera alla 63 tabeller, och Python-tjänstens modeller genereras ur samma definition av ett skript. En grind i bygget jämför det genererade med det incheckade och fäller vid avvikelse, så två system som beskriver samma tabell olika går inte att checka in.
Hårda domängränser
NestJS äger affärsdata — konton, organisationer, enkäter, planer. Python-tjänsten äger AI-domänen — trådar, inbäddningar, minne, supervisorn. Webben anropar båda direkt, och gränsen står i klartext i repots instruktionsfil, vilket gör den till ett beslut andra kan följa.
Sju modeller blev en
Planeringshierarkin lades om till en tabell med en typdiskriminator, plus en tabell för nyckelresultat och en för relationer. Vokabulären stängdes, och AI-lagret fick tala exakt samma ord som duken. Blockeraren som gällde den saken stängdes den tionde juni 2026.
Grindar bär gränserna
Ett skript håller antalet importer från de ärvda systemen på noll och fäller bygget vid första återfall. Ett annat fäller schemat när de genererade modellerna har glidit. Konsolideringen håller för att den kontrolleras vid varje ändring.
Organisationens data hamnade i prompten
Enkätresultat, svaga motorer och organisationsprofil injiceras numera i systemprompten för de miljöer som behöver dem. Tidigare låg informationen bakom verktyg som modellen själv måste välja att anropa, vilket den ibland lät bli.
Teknik
- NestJS
- FastAPI
- Next.js
- Drizzle ORM
- SQLAlchemy
- LangGraph
- PostgreSQL
- pgvector
- BullMQ
- Azure Container Apps
Vad beviset räcker till
Det här visar att fyra system går att slå ihop till ett och hållas ihop av grindar. Det visar ingenting om en marknad: plattformen hade inte lanserats vid junigränsen, verdiktet i repots beredskapslogg var driftsättningsbar med kvarstående punkter, och en av dem var en manuell säkerhetsåtgärd som ingen kod stänger.
Underlag
Vad den här artikeln vilar på — en mätning vi gjort, en daterad källa eller ett beslut vi tagit och vad det kostade.
- Mätning
Hur många tabeller den enda schemaauktoriteten definierar
Mätobjekt: Changemkrs schemakatalog vid junigränsen
Metod: Räkna anropen till pgTable i packages/database/src på sista incheckningen i juni 2026.
Resultat: 63 tabeller
- Beslut
Låt ett enda schema definiera alla tabeller och generera Python-tjänstens modeller ur det.
Vad det kostade: Varje schemaändring kräver ett extra genereringssteg innan den kan checkas in, och en handredigerad modell fäller bygget även när den är riktig.
- Beslut
Lägg sju modeller för planeringshierarkin i en tabell med en typdiskriminator.
Vad det kostade: Databasen kan inte längre skilja objekttyperna åt med egna kolumner, så reglerna för vad som får ligga var flyttade upp i applikationen och behöver egna tester.
Vanliga frågor
- Är Changemkr en kund till Torn Studio?
- Studion äger en del av plattformen och hade produktrollen där, vilket står överst på sidan. Skillnaden spelar roll: ett uppdrag åt någon annan och en produkt studion är med och äger är olika påståenden, och läsaren ska få veta vilket det är innan resultaten.
- Varför slutar caset i juni 2026?
- Studions produktroll löpte till dess. Plattformen har utvecklats vidare efteråt av andra, och att räkna in det arbetet vore att ta åt sig äran för någon annans. Varje siffra på sidan är mätt vid den gränsen och går att kontrollera där.
- Varför står det ingen siffra på hur många test som gick igenom?
- Repot mätte om sin testsvit i augusti 2026 och drog tillbaka den tidigare siffran som ogiltig. En siffra som källan själv har återkallat hör inte hemma här, så sidan citerar sådant som var stabilt vid gränsen: tabeller, tjänster, AI-miljöer och testfiler.
- Vad betyder en schemaauktoritet i praktiken?
- Att en enda definition håller alla 63 tabeller och att allt annat härleds ur den. Python-tjänstens modeller genereras av ett skript, och en grind fäller bygget när det genererade och det incheckade har glidit isär. Två system som beskriver samma tabell olika blir omöjligt att checka in.
- Hur stor del av koden skrev studion?
- Studion byggde stora delar av produkten under perioden och formulerade merparten av idéerna och funktionerna, samtidigt som andra också arbetade i kodbasen. Sidan påstår därför en roll och en period, och siffrorna beskriver det levererade systemet vid gränsen.
- Går ett sådant här arbete att köpa av studion?
- Ja, i två former. Konsolidering och AI-integration ligger under AI och automation, och produktrollen — beslutsunderlag, prioritering, arkitekturval — ligger under Product Management. Ett uppdrag börjar med en genomgång på fast pris innan något byggs.
Berätta vad du vill bygga
Trettio minuter, kostnadsfritt, och ett rakt besked om vi är rätt studio för uppdraget.
Svar inom ett dygn, skriftligt förslag med fast pris inom tre dagar, och du bestämmer i lugn och ro.
Nöjdhetsgaranti