Impulse AI Docs
Intern dokumentasjon
skipLink.label

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
PulseNarrativeBreakthroughs
SporsmaalHva skjer akkurat na?Hva utvikler seg over tid?Hva har jeg oppdaget?
PlasseringHome-skjermInsights-skjermInsights-skjerm
Format2 setninger, ~45 ordHeadline (5-8 ord) + 2-3 setninger (~70 ord)Title-label (3-6 ord) + 1 setning (~30 ord) per klynge
Datakilde5 siste moments (impulser + check-ins + sessions)Embedding-analytics + impulser + momentum + balance + transformationsKun session-klynger (keyInsight + transformation)
TidsperspektivNa, denne ukenOver uker/manederFortid (fullforte sessions)
Gate1+ impuls3+ impulser med embeddings2+ sessions med embeddings (Mastery)
Regen-throttle6 timer24 timer24 timer
Versjonv5.0v3.0v2.0

Kjerneprinsipp: Bruker-agency

heading.anchorLabel

Alle 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.

ProduktAgency-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.anchorLabel

Fil: 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.anchorLabel

Concept (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 det
endrer allerede hvordan neste mote lander."

Narrative — Trajektor-forteller

heading.anchorLabel

Fil: 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.anchorLabel

Concept (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.anchorLabel

Fil: 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.anchorLabel

Concept (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.anchorLabel

Hvert 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 jobb

Denne kryssreferansen sikrer at produktene ikke glir inn i hverandres domene over tid.

DSL-arkitektur

heading.anchorLabel

Alle 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.anchorLabel

Rendert 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.anchorLabel

Alle tre produkter regenereres av samme worker (insightsRegenerationQueue):

TriggerFaseHva regenereres
Impuls klassifisertpulseKun Pulse
Check-in vurdertpulseKun Pulse
Session fullfortfullPulse + 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.anchorLabel

Nar du justerer prompter, folg denne sjekklisten:

  1. Identifiser riktig lag: Er endringen i WHAT (concept) eller HOW (style)?
  2. Sjekk grensevakten: Glir endringen inn i et annet produkts domene?
  3. Oppdater forbidden: Hvis du utvider et produkts scope, legg til tilsvarende forbidden i de andre to
  4. Bump versjon: Oppdater metadata.version i promptkonfigen
  5. Verifiser agency: Fremstilles brukeren som aktiv deltaker?
  6. Test med lite data: Sorg for at produktene foles distinkte selv med 1-3 impulser