feat(m1): add kandidatvurdering skill that persists nothing

This commit is contained in:
Kjell Tore Guttormsen 2026-09-04 21:30:14 +02:00
commit cdb4a8fda9
3 changed files with 268 additions and 0 deletions

View file

@ -0,0 +1,73 @@
---
name: kandidatvurdering
description: "Scorer en stillingsannonse mot kandidatprofilen, kjoerer hardfiltrene foerst og leverer score, begrunnelse og bekymringer paa norsk. Skriver ingenting. Utloeses av vurder denne annonsen, score denne stillingen, hva er scoren på denne, hva er scoren pa denne, passer denne stillingen for meg, kjør hardfiltrene og kjor hardfiltrene."
triggers:
- vurder denne annonsen
- score denne stillingen
- hva er scoren på denne
- hva er scoren pa denne
- passer denne stillingen for meg
- kjør hardfiltrene
- kjor hardfiltrene
---
# kandidatvurdering
Scorer én annonse mot `profil/kandidat.md`. **Skriver ingenting.** Ingen fil,
ingen logg, ingen sak. I M1 finnes ingen ingest-vakt ennå, så teksten som
vurderes er utrygg — og det eneste som holder den utenfor arbeidsmappa, er at
denne stien ikke skriver i det hele tatt. Skal noe lagres, er det `beslutning`
og `sak` som gjør det, etter at operatøren har bestemt seg.
All operatørrettet tekst er norsk bokmål.
## Arbeidsdelingen
Regnestykket er ikke ditt. Du leverer skjønn per kriterium; scriptet
`${CLAUDE_PLUGIN_ROOT}/scripts/vurdering.py` gjør aritmetikken. En score du
regner ut selv er ikke reproduserbar, og M6 leser den som et tall på en
vektavhengig skala.
Gjør dette, i denne rekkefølgen:
1. Les profilen med `les_profil_fil(root, "profil", "kandidat.md")`.
2. Sett delscore for hvert kriterium — `fagomrade`, `oppgavetype`,
`teknologi`, `selskapstype` — som et heltall 0-100. Alle fire må være med;
et manglende eller ugyldig kriterium blir avvist ved navn.
3. Skriv bekymringene dine som fri tekst i `bekymringer`. Scriptet leverer dem
tilbake urørt — det oppfinner ingen.
4. Kall `vurder(profil, annonse, brodtekst, last)` og les resultatet.
## Les resultatet slik
- **`verdikt`** er `avvist` så snart minst én hardfilter slo til, ellers
`vurderes`.
- **`avvisninger`** navngir frontmatter-nøkkelen hver avvisning kom fra. Gjengi
nøkkelen ordrett. Annonsen får en score uansett, slik at operatøren kan veie
avslaget mot et tall.
- **`advarsler`** er filtre som ikke kunne kjøre. Lønn som ikke er oppgitt er
ikke lønn under gulvet, og en stillingskode rangtabellen ikke kjenner er
ikke lav senioritet. Si hva som ikke ble sjekket.
- **`vekt_hash`** identifiserer vektvektoren scoren ble regnet med. Ta den med
når scoren refereres videre.
Står arbeidsstedet i profilens `arbeidssteder`, blir reisetid en advarsel og
ikke et avslag. Det er operatørens eget valg, kodet — ikke en lekkasje i
filteret.
## Lever på norsk
Gi operatøren fire ting, i denne rekkefølgen: score, verdikt med de
navngitte nøklene, begrunnelse for delscorene, og bekymringene. Ikke pynt på
et avslag, og ikke gjett på lønn eller reisetid annonsen ikke oppgir.
## Uten verktøyserveren
Er `jobbsok-tools` ikke tilgjengelig, degraderer skillen i stedet for å stoppe:
les profilen direkte, sett delscorene som vanlig, og be operatøren kjøre
scriptet fra kommandolinja for aritmetikken. Ikke regn ut summen selv som en
mellomløsning — da er tallet ikke lenger reproduserbart, og det er hele
poenget med delingen.
Vektene og frontmatter-kontrakten står i
`${CLAUDE_PLUGIN_ROOT}/skills/kandidatvurdering/references/vekter.md`.

View file

@ -0,0 +1,49 @@
# Vekter for kandidatvurdering
## Kriteriene
Fire, og bare fire. Delscore settes per kriterium som et heltall 0-100.
Mangler ett, eller ligger ett utenfor intervallet, blir hele lasten avvist ved
navn — det er med vilje, siden en score regnet på tre av fire kriterier ser
akkurat ut som en score regnet på alle fire.
| Kriterium | Hva det måler | Standardvekt |
| --- | --- | --- |
| `fagomrade` | treff mot dybden i profilen | 40 |
| `oppgavetype` | er oppgavene de operatøren vil ha | 30 |
| `teknologi` | teknologisk overlapp | 20 |
| `selskapstype` | organisasjonsform og modenhet | 10 |
Tallene summerer til 100 for at vektoren skal leses som en fordeling.
Aritmetikken normaliserer på summen, så en hvilken som helst ikke-negativ
heltallsvektor virker like godt.
## Frontmatter-kontrakten
Profilen kan overstyre vektene med en `vekter`-nøkkel i frontmatter
(operatørbeslutning 14.3):
```
vekter:
fagomrade: 4
oppgavetype: 3
teknologi: 2
selskapstype: 1
```
Rapporten fra skjemasjekken sier hvor vektene kom fra:
- `vekter_kilde: profil` — profilen oppga dem
- `vekter_kilde: default` — profilen oppga dem ikke, og standardvektene over
gjelder
Manglende kriterium under `vekter` arver standarden og gir en advarsel. Et
ukjent kriterium gir en advarsel og leses ikke. En vekt som ikke er et heltall
≥ 0 er en feil.
## Vekthashen
Hver score følges av `vekt_hash`, en sha256 over vektvektoren. Den skrives ned
sammen med scoren ved beslutningstidspunktet, slik at en senere endring av
vektene blir synlig i stedet for å reskalere historikken i stillhet. To scorer
med ulik `vekt_hash` er ikke sammenlignbare tall.