# CVSmia - Brukerveiledning

Denne siden beskriver hvordan du bruker CVSmia til å lage og lagre en tilpasset CV basert på grunndata i [jsonresume](https://jsonresume.org/)-format.

## Rask eksempelflyt med norsk eksempeldata

Denne flyten viser den enkleste måten å komme i gang på med den norske eksempel-CV-en som appen legger i `Dokumenter\Solsem Consulting\CVSmia`.

### 1. Start appen og sjekk fanene

Ved oppstart åpner appen i `Tilpasser`, og `Validering` er synlig som egen fane fra start.

![Oppstart i norsk UI](images/usage-nb-01-start.png)

### 2. Åpne den norske eksempel-CV-en

Trykk `Ctrl+O` eller velg `Tilpasser -> Åpne`, og åpne `sampleresume_nb_NO.json`.

![Åpne norsk eksempeldata](images/usage-nb-02-open-dialog.png)

### 3. Se kildedataene i venstre tre

Når filen er lest inn, vises seksjonene fra jsonresume i venstre side under `Kildedata`. I skjermbildet under er toppnoden ekspandert så du ser hvilke seksjoner eksempeldataene inneholder.

Du kan også skrive inn tekst i filterfeltet over `Kildedata` og trykke `Filtrer` for å vise bare noder som matcher teksten, sammen med nødvendig kontekst i treet.

![Kildedata lastet inn](images/usage-nb-03-source-loaded.png)

### 4. Lag en første tilpasset CV

For en rask første test kan du holde `Ctrl` og klikke på toppnoden `resume` i venstre tre. Da kopieres hele eksempel-CV-en til høyre side. I vanlig bruk kan du i stedet `Ctrl`-klikke eller dra enkeltseksjoner for å bygge en mer målrettet variant.

![Eksempeldata kopiert til tilpasset CV](images/usage-nb-04-tailored-from-sample.png)

### 5. Åpne den tilpassede CV-en i viewer

Når du har innhold i høyre tre kan du åpne viewer med `Ctrl+P` eller via menyvalget for visning med data. Viewer viser den tilpassede CV-en i et utskriftsvennlig oppsett.

![Tilpasset CV åpnet i viewer](images/usage-nb-05-viewer-open.png)

### 6. Skriv ut til PDF fra viewer

Når viewer er åpen, trykk `Ctrl+P` i nettleseren og velg `Lagre som PDF` eller en PDF-skriver som `Microsoft Print to PDF`. Utskriftsdialogen kommer fra nettleseren, så navn og plassering på valgene kan variere litt.

![Viewer klar for utskrift til PDF](images/usage-nb-06-viewer-print-step.png)

Etter dette kan du lagre PDF-en til ønsket mappe, eller fortsette med å fjerne, gi nytt navn til eller lagre JSON-innholdet i høyre tre.

## Moduloversikt med skjermbilder

Skjermbildene under viser de øvrige modulene i appen. Noen av dem krever lisens før fanen blir synlig.

### 7. Validering

`Validering` brukes når du vil kontrollere JSON mot schema, lese feil per sti/linje og eventuelt redigere innholdet før du lagrer på nytt.

![Validering-modulen](images/usage-nb-07-validation.png)

### 8. AI-Customizer

`AI-Customizer` er en egen arbeidsflate for å velge relevant CV-innhold mot en stillingsannonse ved hjelp av AI. Her jobber du med kildedata til venstre, AI-tilpasset CV til høyre og stillingsannonse nederst.

![AI-Customizer i norsk språkdrakt](images/usage-nb-08-ai-customizer.png)

### 9. JsonResumeConverter

`JsonResumeConverter` brukes når du vil lese inn råtekst eller annen kilde og konvertere den til jsonresume, med AI-forsøk først og lokal fallback ved behov.

![JsonResumeConverter i norsk språkdrakt](images/usage-nb-09-converter.png)

### 10. Matcher

`Matcher` lar deg lese inn både CV og stillingsbeskrivelse og kjøre matching i egen modul uten å endre trærne i `Tilpasser`.

![Matcher-modulen i norsk språkdrakt](images/usage-nb-10-matcher.png)

### 11. Cognitive

`Cognitive` er modulen for språklige forslag og omskriving. Den brukes når du vil få hjelp til å forbedre eller variere tekstinnhold.

![Cognitive-modulen i norsk språkdrakt](images/usage-nb-11-cognitive.png)

## Hva er CVSmia?

CVSmia lar deg:

- åpne kildedata (venstre tre),
- bygge en tilpasset CV ved å velge innhold (høyre tre),
- lagre resultatet i et implementert eksportformat (typisk jsonresume, og Teamtailor når modulen er lisensiert),
- forhåndsvise i viewer og validere mot schema.

## Vanlig arbeidsflyt

1. Åpne kildedata med `Ctrl+O`.
2. Filtrer eventuelt kildedata med tekstfeltet over venstre tre hvis du vil snevre inn store datasett.
3. Legg til innhold fra venstre til høyre med drag-and-drop eller `Ctrl+klikk`.
4. Rediger høyre tre der det er tillatt (`F2` for navn, `Delete` for å fjerne).
5. Lagre med `Ctrl+S`.
6. Forhåndsvis i viewer med `Ctrl+P` (med data) eller `Ctrl+Shift+V` (uten data).
7. Skriv ut til PDF fra viewer med `Ctrl+P` i nettleseren.

## Validering

Validering-fanen brukes til å:

- kjøre validering,
- se feil (sti/linje/melding),
- kopiere feil,
- redigere JSON,
- lagre korrigert innhold.

Hvis du åpner en ugyldig fil settes den som pending i validering til den er rettet og lagret.

## Matcher

- Matcher-fanen viser nå et eget tre med JSONResume-data som matchingen kjører mot.
- I `Match`-menyen kan du velge `Åpne CV…` for å lese inn CV, og `Åpne jobbeskrivelse…` for å lese inn stillingsbeskrivelse før du kjører match.
- Innlesing via `Match` påvirker ikke `Customize`-trærne.
- Innlesing av kildedata i `Customize` oppdaterer heller ikke `Matcher` automatisk.
- Etter kjøring viser Matcher nå et eget felt med anbefalte neste steg, for eksempel hvilket krav som bør dekkes bedre eller hvilket eksisterende CV-bevis som bør løftes frem.
- Når lisens tillater modulen, vises `AI-Customizer` som tab nr. 2.

## Snarveier

- `Ctrl+O`: Åpne fil
- `Ctrl+S`: Lagre tilpasset CV
- `Ctrl+P`: Åpne viewer med data
- `Ctrl+Shift+V`: Åpne viewer
- `Ctrl+Shift+O`: Les fra Github (alle steder menyvalget finnes)
- `Ctrl+,`: Innstillinger
- `F1`: Åpne lokal hjelp
- `Alt+F4`: Avslutt appen (samme i modulmenyer som `Customize`, `AI-Customizer`, `Validation`, `Converter`, `Cognitive` og `Match`).
- `Delete`: Fjern valgt node i høyre tre
- `F2`: Gi nytt navn til redigerbar node i høyre tre
- I modulmenyer brukes nå samme snarveier for tilsvarende valg (f.eks. `Åpne` = `Ctrl+O`, `Lagre` = `Ctrl+S`, `Vis med data` = `Ctrl+P` der funksjonen finnes).

## Tips

- Hold en rik master-CV i kildedata og lag målrettede varianter i høyre tre.
- Kjør validering før du deler/publiserer.

## Maskinlesbart lisensmanifest

- Appen eksponerer støttede lisensmoduler i `license-modules.json` i app-mappen.
- Kildeversjonen ligger i `src/CVSmia.Licensing/license-modules.json`.
- Filen bruker generisk protokollformat med `protocolVersion`, `application` og `modules[].id`.
- Filen bygges fra `src/CVSmia.Licensing/EnumAppModules.cs`, så oppdater enumen og bygg prosjektet når modulsettet endres.
- `None` er bevisst utelatt fra manifestet.

## Valgfri lokal telemetri

- Telemetri er av som standard og må aktiveres eksplisitt i `settings.json` eller `appsettings.json` med `Settings:TelemetryEnabled = true`.
- Når telemetri er aktivert, skriver appen lokale hendelser til `%APPDATA%\Solsem Consulting\CVSmia\telemetry.ndjson` hvis `Settings:TelemetryStoragePath` ikke er satt.
- Hendelsene dekker foreløpig appstart og resultat av lisenssjekk ved oppstart.
- Rå kunde- og lisensidentifikatorer lagres ikke i denne telemetrifilen.

## Lisenssjekk ved oppstart

- Betalt lisens kan nå verifiseres mot SentinelCore ved oppstart når `LicenseCallHome` er satt opp i `appsettings.json`.
- Samme call-home-flyt brukes også når betalt lisens installeres eller lastes på nytt fra appen, slik at aktiv lisens sjekkes konsekvent mot SentinelCore.
- Første utrulling bruker `ObserveOnly`. Det betyr at gyldig lokal betalt lisens fortsatt får starte ved nettfeil selv om lease-cache mangler, men hendelsen logges tydelig.
- Trial håndteres fortsatt lokalt via `trial.dat` og Registry. Trial gjør ikke call-home.
- Hvis en betalt lisensfil finnes men er lokalt ugyldig, faller appen fortsatt ikke tilbake til trial.
- Hvis SentinelCore avviser den betalte lisensen online, avvises oppstarten som betalt lisens uten fallback til trial.
- Ved nettfeil forsøker appen å bruke lokal lease-cache i `%APPDATA%\Solsem Consulting\CVSmia`.

Eksempel på konfig:

```json
{
  "LicenseCallHome": {
    "Enabled": true,
    "Mode": "ObserveOnly",
    "BaseUrl": "https://sentinelcore.example.no/",
    "VerifyTimeoutSeconds": 5,
    "MetadataRefreshHours": 24,
    "LeaseCacheFileName": "sentinelcore-lease.json",
    "InstallationIdFileName": "installation-id.json"
  }
}
```

## GitHub som kilde for resumedata

- Bruk menyvalget `Les fra Github` når du vil lese inn resumedata fra GitHub.
- Menyvalget er tilgjengelig i `Customize`, `JsonResumeConverter`, `AI-Customizer` og `Matcher`.
- Før menyvalget blir aktivt må du sette opp GitHub i `Innstillinger` med enten `Token` eller `Brukernavn og passord`.
- GitHub-legitimasjon lagres kryptert lokalt per bruker.
- Når du velger `Les fra Github`, vises en GitHub-dialog der du kan bla i tilgjengelige repoer, velge gren og navigere deg frem til ønsket fil.
- Du trenger ikke lenger å lime inn rå GitHub-URL manuelt.
- Lokal filinnlesing via `Åpne` fungerer fortsatt som før.
- GitHub-menyene er deaktivert når nødvendig GitHub-legitimasjon ikke er satt.
- For github.com anbefales token-autentisering.

## jsonresume-konvertering og AI

- `JsonResumeConverter` forsøker AI-konvertering først.
- `JsonResumeConverter` bruker samme AI-innstillinger som AI-tilpasser (`AiEnabled`, `AiProvider`, `AiModel`, `AiEndpoint`) fra `settings.json`/`appsettings.json`.
- `JsonResumeConverter` bruker samme provider-resolver som AI-tilpasser; valgt provider/modell i innstillinger brukes direkte (inkludert Gemini, Anthropic og Ollama), med lokal fallback ved feil.
- `JsonResumeConverter` bruker nå samme AI-integrasjonsmønster som AI-tilpasser: panelet kaller en dedikert AI-assistenttjeneste, og converter-modulen gjør kun AI-forsøk + lokal fallback.
- `JsonResumeConverter` viser nå i overskriften om resultatet kom fra AI eller lokal fallback.
- `Validation` kjører alltid lokal schema-validering først, og forsøker deretter AI-forklaring i egen prompt-modus (`ValidationAssistant`) når valideringen finner feil.
- Hvis AI er deaktivert, API-nøkkel mangler, valgt provider ikke støttes eller AI-kallet feiler, viser `Validation` nå en kort status om at lokal fallback brukes.
- `Validation` viser nå også lokale rettingsforslag i egen `Forslag`-kolonne for vanlige feil som manglende felt, ugyldige datoer og typeavvik.
- Sammendragsfeltet i `Validation` fremhever også konkrete forslag til hva som bør rettes først.
- Statuslinjen i appen viser nå tydeligere neste steg etter innlesing, matching, validering, lagring og preview.
- OpenAI-kompatible kall (payload, autentisering og parsing av svar) er flyttet til delt bibliotek `CVSmia.Ai`, som brukes av både AI-tilpasser-providerne og `JsonResumeConverter`.
- Prompt-/instruksbygging ligger modulspesifikt: `JsonResumeConverter` bruker egen prompt-builder (`IJsonResumePromptBuilder`) og deler ikke selve domeneinstruksene med andre moduler.
- AI-kall brukes når gyldig API-nøkkel er tilgjengelig (`OPENAI_API_KEY` eller lagret nøkkel i `%APPDATA%\Solsem Consulting\CVSmia\ai-api-key.dat`).
- I AI-tilpasser er menyvalget `Tilpass med AI` deaktivert når `AiEnabled` er av eller når lagret API-nøkkel mangler.
- Hvis AI-kapabilitet mangler eller AI-kallet feiler, brukes lokal heuristisk fallback automatisk.
- `AI-Customizer` og `AI Assistert CV Manipulator` bruker nå samme standardmeldinger som øvrige AI-flyter når AI er deaktivert, API-nøkkel mangler eller valgt provider ikke støttes.
- Hvis du åpner ugyldig JSONResume i AI-Customizer (`Open source data`), sendes filen til Validation-modulen slik at feil kan gjennomgås/rettes.
- Når Validation lagrer/fikser pending JSON, sendes data tilbake til samme modul den kom fra (Customize eller AI-Customizer).
- AI-Customizer har nå eget menyvalg for å lese inn tekst fra stillingsannonse direkte til stillingsannonse-feltet.
- `Open JD` i AI-Customizer leser alltid rå tekst og går ikke via Validation-modulen.
- Instruksene til modellen ligger i `prompts/jsonresume-extract.no.json` med feltene `systemInstruction` og `userTemplate`.

## Endre AI-instrukser uten ny build

Du kan endre AI-systeminstruks og prompt-templates uten å rekompilere:

- Standard for installasjonen: rediger `ai-prompts.json` i app-mappen (samme sted som `CVSmia.exe`).
- Lokal overstyring per bruker: opprett/rediger `%APPDATA%\Solsem Consulting\CVSmia\ai-prompts.override.json`.

Når brukes hva:

- `ai-prompts.json`: når du vil endre standard oppførsel for hele installasjonen.
- `ai-assisted-cv-manipulator-instructions.json`: når du vil styre hvilke ferdigdefinerte instruksjoner som vises i `AI Assistert CV Manipulator`.

## AI Assistert CV Manipulator

`AI Assistert CV Manipulator` er en egen modul for fritekstbasert AI-bearbeiding av CV-data.

- Modulen krever egen kjøpt lisens og vises ikke uten betalt modultilgang.
- Lim inn CV-data i venstre tekstfelt.
- Bruk `Ctrl+O` eller menyvalget `Åpne` når du vil lese kildedata direkte inn i venstre tekstfelt.
- Skriv en egen instruks i midtkolonnen eller velg en ferdigdefinert instruks fra nedtrekkslisten.
- Klikk `Utfør` for å sende instruks og CV-data til valgt AI-modell.
- Resultatet vises i høyre tekstfelt.
- Bruk `Lagre til fil` for å lagre resultatet fra høyre tekstfelt til fil.
- Bruk `Rediger instruksjoner` for å åpne og lagre JSON-listen som styrer dropdownen direkte fra modulen.

Ferdigdefinerte instruksjoner hentes fra `ai-assisted-cv-manipulator-instructions.json` i app-mappen. Standardfilen bruker ferdige ressursnøkler, men du kan også legge inn egne `displayName`- og `instruction`-verdier direkte i JSON-filen hvis du vil definere egne presets.
Standardlisten inkluderer blant annet oppsummering, ferdighetsuttrekk, rolleprofil, konvertering til jsonresume, oversettelse til engelsk, oversettelse til norsk bokmål og kvalitetssjekk for manglende informasjon.
- `ai-prompts.override.json`: når én bruker vil overstyre lokalt uten å endre installasjonsfiler.

Viktig:

- Bruk gyldig JSON.
- Template-feltene må beholde nødvendige tokens:
  - matching-template: `{{jobDescription}}` og `{{resumeElements}}`
  - customizer-template: `{{jobAdText}}`, `{{maxSelections}}` og `{{minConfidencePercent}}`
  - validation-template: `{{validationIssues}}` og `{{resumeJson}}`
- Tone-spesifikk systeminstruks kan også overstyres med `SystemInstructionByTone.ValidationAssistant`.
- Hvis filen mangler eller er ugyldig, bruker appen innebygde standardverdier.

## AI-tilpasser: confidence-terskel

- AI-tilpasser bruker nå både maks antall valg og minimum confidence-prosent.
- `AiCustomizeMinConfidencePercent` (0-100, standard 60) styrer hvilke AI-valg som tas med.
- Elementer med oppgitt `confidence` under terskelen blir filtrert bort før innlegging i tilpasset CV.
- `confidence` tolkes både som prosent (0-100) og desimal (0-1), slik at f.eks. `82` og `0.82` behandles likt.
- For at confidence skal komme tilbake må prompt-formatet be om `selected[].confidence`; systeminstruksen er nå justert til å følge output-format i brukerprompten.
- AI-tilpasser bruker nå egen prompt-modus mot provider (`CustomizerSelection`) slik at output-formatet for customizer ikke overstyres av generell `matchedIds`-template.
- Etter AI-kjøring vises en oppsummering av hvor mange noder som hadde `confidence` og hvor mange som manglet.
- Hold musen over en node i høyre tre (tilpasset CV) for å se node-spesifikk AI-confidence når den er tilgjengelig.
- Noder i høyre tre fargekodes også etter confidence (høy = grønn, medium = gul, lav = rød).
- Confidence-farge legges på selve nodeområdet i treet (ikke over hele radbakgrunnen).
- Ved trunkert/ufullstendig AI-JSON forsøker AI-tilpasser nå ikke å parse hele teksten som JSON; den går direkte til robust fallback-ekstraksjon av `id`/`confidence` fra svarteksten.
- For OpenAI/Azure OpenAI bruker AI-tilpasser nå JSON-mode (`response_format: json_object`) og høyere token-grense i customizer-kall for å redusere avkuttede svar.
- AI-tilpasser bruker nå to-pass utvalg for bedre treff når modellen foreslår mange noder: pass 1 henter bredt kandidatutvalg, pass 2 reranker kun kandidatene og returnerer topp `maxSelections`.
- Manuell drag-and-drop støttes begge veier i AI-tilpasser: dra fra venstre tre til høyre for å legge til, og dra fra høyre tre tilbake til venstre for å fjerne fra `AI-tilpasset CV`.
- I høyre tre kan valgt node også fjernes med `Delete`-tasten.
