Insights-dataprodukter
Impulse AI har tre distinkte AI-genererte dataprodukter som reflekterer brukerens transformasjonsreise. Hvert produkt svarer pa ett spesifikt sporsmaal, har en unik stemme, og eier et avgrenset domene. Denne siden dokumenterer rolledelingen, promptarkitekturen, og reglene som sikrer at produktene ikke overlapper.
Produktoversikt
heading.anchorLabel| Pulse | Narrative | Breakthroughs | |
|---|---|---|---|
| Sporsmaal | Hva skjer akkurat na? | Hva utvikler seg over tid? | Hva har jeg oppdaget? |
| Plassering | Home-skjerm | Insights-skjerm | Insights-skjerm |
| Format | 2 setninger, ~45 ord | Headline (5-8 ord) + 2-3 setninger (~70 ord) | Title-label (3-6 ord) + 1 setning (~30 ord) per klynge |
| Datakilde | 5 siste moments (impulser + check-ins + sessions) | Embedding-analytics + impulser + momentum + balance + transformations | Kun session-klynger (keyInsight + transformation) |
| Tidsperspektiv | Na, denne uken | Over uker/maneder | Fortid (fullforte sessions) |
| Gate | 1+ impuls | 3+ impulser med embeddings | 2+ sessions med embeddings (Mastery) |
| Regen-throttle | 6 timer | 24 timer | 24 timer |
| Versjon | v5.0 | v3.0 | v2.0 |
Kjerneprinsipp: Bruker-agency
heading.anchorLabelAlle tre produkter opererer fra samme grunnholdning: brukeren er en aktiv deltaker, aldri et passivt subjekt. De har registrert impulser, gjort check-ins, gjennomfort sessions. Appen anerkjenner dette arbeidet.
| Produkt | Agency-uttrykk |
|---|---|
| Pulse | ”du tok grep, noe losner allerede” |
| Narrative | ”du har jobbet med dette, noe gir etter” |
| Breakthroughs | ”du motte dette og det skiftet” |
Aldri fremstill brukeren som passivt observert (“et monster utvikler seg i deg”). Brukeren er agenten, ikke subjektet.
Pulse — Situasjonelt speil
heading.anchorLabelFil: apps/api/src/ai/insights/pulse.ts
Cache: analytics_dashboard_cache.summary.pulse
Pulse er et sanntidsspeil som fanger hva som skjer i brukerens liv akkurat na. Den leser de 5 siste “moments” (impulser, check-ins, sessions) og gir en umiddelbar, situasjonell observasjon.
DSL-struktur (Formula/Bottling)
heading.anchorLabelConcept (Formula — locked):
- Essence: Situasjonelt snapshot som anerkjenner momentum
- Required: Setning 1 = hva som er live na. Setning 2 = forward movement. Grunn i siste moment. Ett trad.
- Forbidden drift: Monsteranalyse, trajektor-sprak, abstrakte temaer
Style (Bottling — tunable):
- Situasjonell stemme, present tense
- Anerkjenn momentum — brukeren er i bevegelse
- Conditional: check-ins (DO→BE bridge), sessions (friskhet av endring), impulser (awareness som forste steg)
Forbidden (NEVER-blokk)
heading.anchorLabel- Monster/trajektor-sprak (“over time”, “recurring theme”) — det er Narratives jobb
- Rad eller instruksjoner
- Metrikker eller telling
- Ros eller gratulasjon
- Fremstille brukeren som passiv
Eksempel-output
heading.anchorLabel"Akkurat na forsvinner du inn i andres agendaer. Men du sa det — og detendrer allerede hvordan neste mote lander."Narrative — Trajektor-forteller
heading.anchorLabelFil: apps/api/src/ai/insights/narrative.ts
Cache: analytics_dashboard_cache.summary.narrative
Narrative reflekterer hva som utvikler seg over tid — trajektorien, ikke oyeblikket. Den bruker embedding-analytics (drift, focus, stuck patterns, resolved themes) for a gi brukeren innsikt i sin egen utvikling.
DSL-struktur (Formula/Bottling)
heading.anchorLabelConcept (Formula — locked):
Headline:
- Essence: 5-8 ord som navngir trajektorien
- Required: Navngi bevegelse/utvikling, spesifikt for deres arc
- Forbidden: Generisk motivasjon, rad, situasjonelt sprak
Body:
- Essence: 2-3 setninger, max 70 ord, trajektor over tid
- Required: S1 = tema brukeren har jobbet med. S2 = hva innsatsen produserer. S3 = valgfri dybde.
- Forbidden: Situasjonelt sprak, spesifikke session-realiseringer, passiv observasjon, metrikker, meta-kommentarer
Style (Bottling — tunable):
- “TRAJECTORY WITH AGENCY” — brukerens innsats produserer endring
- Lav aktivitet: vaer aerlig (“noe som ble berort hviler i deg”)
- Hoy aktivitet: (“din innsats er synlig — her er hva som endrer seg”)
- Aldri falsk momentum
Forbidden (NEVER-blokk)
heading.anchorLabel- Situasjonelt sprak (“right now”, “this week”) — Pulse sin jobb
- Spesifikke session-realiseringer (“du oppdaget at X”) — Breakthroughs sin jobb
- Passiv subjekt-framing (“et monster vokser frem i deg”)
- Metrikker, rad, terapi-sprak
Eksempel-output
heading.anchorLabel{ "headline": "Frykten for synlighet losner", "body": "Noe du har jobbet med over flere uker begynner a gi etter. Frykten som holdt deg tilbake har blitt mott — og grepet er ikke det samme lenger."}Breakthroughs — Oppdagelseskatalog
heading.anchorLabelFil: apps/api/src/ai/insights/transformation-distillation.ts
Cache: analytics_dashboard_cache.summary.transformations
Breakthroughs katalogerer konkrete oppdagelser fra fullforte sessions. Hver rad er en klynge av semantisk like session-utfall, destillert til ett tema og en setning.
DSL-struktur (Formula/Bottling)
heading.anchorLabelConcept (Formula — locked):
Title:
- Essence: 3-6 ord label som navngir gjennombrudds-temaet
- Required: Brukerens eget sprak, mobilvennlig (max 40 tegn)
- Forbidden: Repetitive apninger, fulle setninger, generiske labels
Insight:
- Essence: En setning (~30 ord) som navngir hva brukeren aktivt jobbet gjennom
- Required: Konkret oppdagelse/slippelse. Eksperiensiell. Fortid.
- Forbidden: Trajektor-sprak, abstrakt monsteranalyse, rad, metrikker
Style (Bottling — tunable):
- Vitne til spesifikke oyeblikk
- Konkret, eksperiensiell sprak (“du motte X og det losnet”)
- Anerkjenn brukerens innsats — realiseringen kom fordi de gjorde arbeidet
Forbidden (NEVER-blokk)
heading.anchorLabel- Trajektor-sprak (“over time”, “developing”) — Narrative sin jobb
- Situasjonelt sprak (“right now”, “this week”) — Pulse sin jobb
- Passiv framing — brukeren gjorde arbeidet aktivt
- Metrikker, rad, terapi-sprak
Eksempel-output
heading.anchorLabel{ "title": "Frykten for a ta plass", "insight": "Du motte frykten for synlighet og oppdaget at det var trygt a vaere tilstede. Noe som holdt deg kontrahert har sluppet."}Grensevakt mellom produktene
heading.anchorLabelHvert produkt har eksplisitt forbidden mot de andre to:
Pulse: forbidden: trajectory ("over time", "pattern of") → Narrative sin jobb forbidden: realizations ("you discovered that") → Breakthroughs sin jobb
Narrative: forbidden: situational ("right now", "this week") → Pulse sin jobb forbidden: realizations ("you discovered that X") → Breakthroughs sin jobb
Breakthroughs: forbidden: trajectory ("developing", "evolving") → Narrative sin jobb forbidden: situational ("right now", "this week") → Pulse sin jobbDenne kryssreferansen sikrer at produktene ikke glir inn i hverandres domene over tid.
DSL-arkitektur
heading.anchorLabelAlle tre produkter bruker Formula/Bottling-monstteret fra concept-types.ts:
FieldDefinition { name: string // Feltnavn (OBSERVATION, HEADLINE, etc.) concept: { // FORMULA — locked, business-critical essence: string // Hva feltet ER (en setning) requiredElements: string[] // Hva som MA vaere med (WHAT) forbiddenDrift: string[] // Konseptuell drift (WHAT NOT) } style: { // BOTTLING — tunable, safe to iterate delivery: string[] // Hvordan levere det (HOW) }}Regel: concept inneholder kun WHAT (innholdskrav og grenser). style inneholder kun HOW (leveringsmal, conditional logic, tone). Aldri bland.
Prompt-rendering
heading.anchorLabelRendert via buildMultiFieldContext() + buildNeverBlock():
CONCEPT — OBSERVATION (non-negotiable):[essence]Required elements: [requiredElements]Must NOT drift toward: [forbiddenDrift]
STYLE — OBSERVATION (delivery guidance):[delivery items]
NEVER (applies to ALL output fields):[global forbidden items]Regenereringsarkitektur
heading.anchorLabelAlle tre produkter regenereres av samme worker (insightsRegenerationQueue):
| Trigger | Fase | Hva regenereres |
|---|---|---|
| Impuls klassifisert | pulse | Kun Pulse |
| Check-in vurdert | pulse | Kun Pulse |
| Session fullfort | full | Pulse + Narrative + Breakthroughs |
Throttle: Pulse 6t, Full 24t. Redis-basert, fail-open. Satt etter suksess, ikke for.
Fallback: Hvis narrative-generering feiler, beholdes eksisterende cached narrative (narrative ?? existingSummary.narrative ?? null).
Se AI Pipeline for fullstendig pipeline-dokumentasjon.
Justering over tid
heading.anchorLabelNar du justerer prompter, folg denne sjekklisten:
- Identifiser riktig lag: Er endringen i WHAT (concept) eller HOW (style)?
- Sjekk grensevakten: Glir endringen inn i et annet produkts domene?
- Oppdater forbidden: Hvis du utvider et produkts scope, legg til tilsvarende forbidden i de andre to
- Bump versjon: Oppdater
metadata.versioni promptkonfigen - Verifiser agency: Fremstilles brukeren som aktiv deltaker?
- Test med lite data: Sorg for at produktene foles distinkte selv med 1-3 impulser