Imported from StianOby/claude-legal-tools (
plugins/lovdata-pro/skills/lovdata-pro/SKILL.md). Install upstream withnpx skills add StianOby/claude-legal-tools --skill lovdata-pro. Copyright stays with the author.
Lovdata Pro — rettspraksis og forarbeider
Dette ferdighetsdokumentet er på norsk. Svaret til brukeren skal alltid
tilpasses brukerens eget språk (samme regel som i lovdata-api-skill-en):
spørsmål på engelsk → svar på engelsk; norsk → norsk; blandet → norsk.
Sitater fra dommer og forarbeider beholdes alltid på originalt norsk.
Denne skill-en bruker Claude Desktops innebygde browser (Cowork-verktøyene
mcp__Claude_Browser__*) til å hente Lovdata Pro-dokumenter direkte i
brukerens innloggede sesjon. Den kjører ikke i Claude Code CLI.
Du har tilgang til to hjelpescript:
scripts/lovdata_ref.py— rent Python, ingen nettverkstilgang. Oversetter en referanse til kandidat-Pro-stier. Kjøres via bash/terminal.scripts/browser/lovdata_pro.js— limes inn i browser-fanen viajavascript_tool. Gjør selve hentingen, seksjoneringen og søket.
(se Base directory for this skill: i starten av konteksten din for stien —
erstatt {SKILL_DIR} nedenfor med den.)
For komplette URL-mønstre, samlingsforkortelser og slug-regler, se
references/lovdata-pro-mapping.md.
Forutsetninger
Denne skill-en krever at Cowork-verktøyene (mcp__Claude_Browser__*, f.eks.
preview_start, navigate, javascript_tool) er tilgjengelige i
verktøylisten din. Hvis de ikke er det (for eksempel når du kjører som
Claude Code CLI): stopp og si til brukeren at denne skill-en bare virker i
Claude Desktop med Cowork aktivert.
Steg 0 — sesjon (alltid først, hver ny samtale)
tabs_context— se om det allerede finnes en fane pålovdata.no/pro. Gjenbruk den om den finnes (cachen iwindow.__lpdør ved navigering, så ikke naviger denne fanen bort frahttps://lovdata.no/pro/for annet enn søk — se Steg 3). Ellers:preview_start {url: "https://lovdata.no/pro/"}.- Hvis et verktøy rapporterer at siden ikke er godkjent ennå:
request_access {url: "https://lovdata.no/pro/", scope: "site"}og prøv igjen. - Lim inn hele innholdet i
{SKILL_DIR}/scripts/browser/lovdata_pro.jsviajavascript_tool(action: "javascript_exec"). Idempotent — trygt å lime inn flere ganger i samme fane. - Kjør
await __lp.isLoggedIn(). På#myPageavgjøres svaret avdocument.title; står fanen på et dokument, gjør funksjonen i stedet et lite prøveoppslag mot Pro (source: "probe").- Ikke innlogget → si til brukeren: "Logg inn på Lovdata Pro i
browser-panelet (SSO/FEIDE går fint). Si fra når du er inne." Vent på
bekreftelse, kjør
isLoggedIn()på nytt. Skriv aldri inn brukernavn/passord selv, og be aldri brukeren oppgi dem til deg — innlogging skjer utelukkende i browser-panelet. - Innlogget → gå videre. Fane-id-en er "sesjonshåndtaket" for resten av samtalen; gjenbruk samme fane til alt under.
- Ikke innlogget → si til brukeren: "Logg inn på Lovdata Pro i
browser-panelet (SSO/FEIDE går fint). Si fra når du er inne." Vent på
bekreftelse, kjør
Du kan slå sammen navigering + paste + isLoggedIn()-sjekk i ett
browser_batch-kall for å spare turer — men bare med navigate;
preview_start kan ikke batches (en batch som starter med navigate åpner
panelet selv).
Steg 1 — oppslag av referanse
python {SKILL_DIR}/scripts/lovdata_ref.py resolve "<referanse>"
Eksempler:
python {SKILL_DIR}/scripts/lovdata_ref.py resolve "HR-2016-2554-P"
python {SKILL_DIR}/scripts/lovdata_ref.py resolve "Ot.prp. nr. 3 (1998-99)"
python {SKILL_DIR}/scripts/lovdata_ref.py resolve "NOU 2022:8"
Returnerer {input, parsed, candidates} pluss disse feltene når de er
aktuelle:
pinpoint— presisering som ble skilt ut av referansen («avsnitt 77», «s. 1827», «punkt 3.4»). Bruk den som søkeord igrep/sectionetter at dokumentet er lastet, og ta den med i sitatet.search_hint— nårparsed:false: søkestrengen som fungerer best i Pro, i Lovdatas egen referanseform (Rt-2000-1811,RG-2010-100), ikke prosasiteringen.note— hvorfor referansen ikke kunne løses, og hvor dokumentet faktisk ligger. Tre tilfeller er verdt å kjenne:- Rt./RG — slug-suffikset er Lovdata-tildelt. Søk på
search_hint. - Meld. St. / St.meld. — ligger i
STS/forarbeid/stsg-<sesjon>-<løpenummer>(Meld. St. 17 (2020-2021) =STS/forarbeid/stsg-202021-352). Løpenummeret kan ikke utledes av referansen; søk og verifiser tittelen på treffet. - St.prp. — ikke-lovproposisjoner er ikke fulltekstindeksert i Pro. Si det til brukeren i stedet for å sitere fra andre kilder.
- Rt./RG — slug-suffikset er Lovdata-tildelt. Søk på
Bruk --json-array for å få bare kandidatlisten (nyttig til å lime rett inn
i __lp.load([...])):
python {SKILL_DIR}/scripts/lovdata_ref.py resolve "HR-2016-2554-P" --json-array
# ["HRSIV/avgjorelse/hr-2016-2554-p", "HRSTR/avgjorelse/hr-2016-2554-p"]
Hvis parsed:false (typisk pre-2008 Rt.-dommer, RG-dommer, uvanlige
referanseformer): hopp til Steg 3 — søk, og søk på search_hint.
Steg 2 — hent dokument
await __lp.load(["HRSIV/avgjorelse/hr-2016-2554-p", "HRSTR/avgjorelse/hr-2016-2554-p"])
Returnerer {path, title, metadata, totalChars, toc} (eller en
{error: ...}-payload — se Feilhåndtering). Dokumentet caches i fanen på
path, så alle videre kall (section, grep, page) på samme path er
gratis (ingen ny nettforespørsel).
To flagg i svaret styrer hva du kan gjøre videre:
metadataOnly: true(ogtotalChars: 0) — dokumentet finnes som metadatapost, men uten brødtekst i Pro. Typisk St.prp., eldre NOU underPUBG, og enkelte meldinger. Ikke siter noe fra en slik post — si til brukeren at fulltekst ikke finnes i Lovdata Pro.noHeadings: true(tocer tom) — dokumentet har ingenh1–h6. Dette er vanlig for dommer: både HR-2016-2554-P og LG-2008-135938 har null overskrifter. Da ersection()ubrukelig; brukgrep()ogpage().
Velg videre strategi ut fra dokumenttype og størrelse:
- Dommer (vanligvis ≤ noen hundre KB): som regel ingen overskrifter, så
bruk
grep(path, "<stikkord eller avsnittsnummer>")for å finne stedet ogpage(path, offset)for å lese rundt det. Er hele dommen liten nok (totalCharsunder ~45 000 tegn —PAGE_SIZE, satt fra den målte grensen for hvor mye ettjavascript_tool-svar tåler), hent den medpage(path, 0). Partene og prosessfullmektigene står ikke i brødteksten — de ligger imetadata.Parter(én linje per part). - Forarbeider (NOU, Prop., Innst. — ofte flere MB): disse har
toc(NOU 2022:8 har 708 seksjoner). Vistoctil brukeren eller velg selv relevante kapitler ut fra tittel/spørsmål.grep(path, "søkeord")finner riktig kapittel raskt;section(path, i)henter det ut. Lovdata bruker ikke<ul>/<li>: litra- og nummerpunkter kommer som én-rads tabeller, ogtoText()gjengir dem som innrykkede linjer («a. konsultere vedkommende folk …»), ikke som rørtabellrader. - Dump-modus — kun når brukeren ber om en full lokal kopi eller
uttømmende gjennomgang: løkke over
page(path, offset)tilnexternull, og skriv hvertexttiloutputs/<slug>.md(bash>>mellom hvert kall). Si fra til brukeren på forhånd omtrent hvor mange kall det tar (Math.ceil(totalChars / 45000)).
Skriv alltid det du skal sitere til fil først, og siter fra filen — ikke
fra samtalens korttidsminne av et tidligere javascript_tool-svar.
Eksempler på JS-kall:
await __lp.section("HRSIV/avgjorelse/hr-2016-2554-p", 3)
await __lp.grep("NOU/forarbeid/nou-2022-8", "urfolk", 600, 20)
await __lp.page("PROP/forarbeid/otprp-3-199899", 0)
grep(path, term, ctx, max, regex) tolker term bokstavelig (og lar
mellomrom matche linjeskift), så «§ 4-6 (2)» og «art. 8(1)» virker som de
står. Send regex: true som femte argument for et ekte regulært uttrykk.
page() klipper alltid til PAGE_SIZE — du kan ikke be om en større bit.
Steg 3 — søk
Brukes når resolve ga parsed:false, eller når et direkte slug-forsøk
feiler med not_found.
Vanlig vei — ett JS-kall:
await __lp.search("Rt-2000-1811", 10)
search() skriver spørringen inn i #quickSearchField-input og sender en
syntetisk keyup med Enter, som er hendelsen GWT-søket faktisk lytter på
(målt: input alene, syntetisk keydown, syntetisk keypress og et ekte
Enter-tastetrykk gjør ingenting — keyup submitter). Deretter venter den på
at hash-en blir #result… og returnerer {query, hash, submitted, results}.
Hash-navigering laster ikke siden på nytt, så window.__lp.cache overlever
et søk i samme fane.
Merk at Pro skriver om spørringen: den settes til små bokstaver og får et
trunkeringsjokertegn (TOSL-2022 → q=TOSL-2022*). submitted viser hva
feltet endte opp med. Ikke sammenlign hash med spørringen din.
Fallback — hvis search() svarer search_timeout:
-
Sørg for at fanen viser søkefeltet (
#quickSearchField-input). -
Skriv inn søketeksten med
computer {action:"type"}. -
Finn søkeknappen (🔍-ikonet ved siden av feltet) med
read_page— den dukker opp sombutton "🔍".computer {action:"screenshot"}kan feile, så ikke regn med skjermbilder her. -
Klikk knappen med
computer {action:"left_click"}. Enter-tasten gjør fortsatt ingenting. -
Vent ~2 sekunder og les ut treffene:
await __lp.readSearchResults(10)
Samme advarsler som før:
- Pro-søk returnerer innholdstreff, ikke dokumenttreff. Et søk på «St.prp. nr. 100 1991-92 EØS-avtalen» kan gi EU-direktiver fra EØS-vedlegget fordi fulltekstsøket slår på alle treff i dokumentkorpuset — ikke selve dokumentet.
- Pre-2008 Rt.-slugs har et opakt suffiks (
rt-YYYY-PAGENUMBER-SUFFIX) som ikke kan gjettes deterministisk — søk er eneste pålitelige vei. - Verifiser alltid at topptreffets
pathfaktisk tilsvarer den etterspurte referansen før du siterer fra den — sjekk tittel/metadata viaload()på treffet. - For proposisjoner og forarbeider: prøv direkte slug-mønstre (Steg 1) først; bruk søk bare som siste utvei.
Sitatformat
Bruk standard norsk juridisk siteringsform i svaret til brukeren:
- Høyesterett (moderne): HR-2016-2554-P avsnitt 77
- Rt.: Rt. 2000 s. 1811 (Finanger I) på s. 1827
- Lagmannsrett: LG-2008-135938
- Forarbeider: Ot.prp. nr. 3 (1998-99) s. 12 eller NOU 2022: 8 punkt 3.4
Sitater beholdes på originalt norsk, i anførselstegn («…» eller "…"). Legg gjerne til oversettelse/forklaring på brukerens språk etter sitatet.
Aldri parafraser fra hukommelsen. Hent dokumentet via __lp.load/
section/page og siter fra det. Eldre dommer endres riktignok ikke — men
forarbeidsprosessen, saksopplysninger og henvisninger varierer mellom
referanseverk og Lovdatas egen tekst, og hallusinasjon av domspremisser har
høy kostnad.
Arbeidsflyt for vanlige oppgaver
Brukeren spør om hva en dom sier
- Steg 0 (sesjon), Steg 1 (resolve), Steg 2 (
load→section/page). - Finn relevante avsnitt, siter på norsk, forklar på brukerens språk.
- Oppgi kilde inkludert avsnittsnummer/side hvor mulig.
Brukeren spør om forarbeidene til en lov
Forarbeidene består typisk av tre dokumenter — alle bør hentes når brukeren ber om «forarbeidene»:
- NOU (utvalgsutredning) —
NOU YYYY:N - Prop. L / Ot.prp. (departementets proposisjon) —
Prop. N L (YYYY-YY)ellerOt.prp. nr. N (YYYY-YY) - Innst. (komitéinnstilling) —
Innst. N L (YYYY-YY)
Disse er ofte 1-3 MB tekst hver. Bruk toc + grep + section for å finne
og hente det relevante kapittelet — ikke hele dokumentet via dump-modus, med
mindre brukeren eksplisitt ber om en full lokal kopi.
Brukeren oppgir en uvanlig referanse (Rt., RG, eldre Ot.prp.)
For pre-2008 Rt.-dommer, RG-dommer, stortingsmeldinger (Meld. St./St.meld.)
og Ot.prp. fra før ~1968 finnes ingen deterministisk slug-regel.
lovdata_ref.py resolve gir parsed:false for disse, med search_hint og en
note om hvor dokumenttypen ligger — gå til Steg 3 (søk) og verifiser
treffet før du siterer.
Pro-søk returnerer innholdstreff, ikke dokumenttreff — se advarslene i Steg 3.
Hvis topptreffet er feil: se gjennom flere av treffene fra
readSearchResults(), plukk riktig path manuelt, og kjør load(path) på
den. Hvis ingen treff er
riktige, fortell brukeren at dokumentet ikke ble funnet og be om mer presis
referanse.
Feilhåndtering
Alle JS-funksjoner returnerer {error: "<kode>", detail} i stedet for å
kaste. Kodene:
not_logged_in→ be brukeren logge inn i browser-panelet (se Steg 0 punkt 4). Ikke debugg videre — dette er alltid årsaken til en tom/uventet respons når du nettopp har startet en ny fane.collection_mismatch→ skjer normalt ikke synlig for deg:load()prøver automatisk SIV/STR-motparten selv. Hvis begge feiler, rapporteres det somnot_foundmed begge stiene idetail.not_found→ sjekk referansen for skrivefeil; prøv Steg 3 (søk). Sjekk også dekningsterskler ireferences/lovdata-pro-mapping.md: lovrelaterte proposisjoner i fulltekst fra sesjon 1984/85, NOU-er i fulltekst fra 1994 (1985–1993 varierer), Innstillinger fra sesjon 1991/92. Eldre NOU-er kan dukke opp underPUBG-samlingen, men har ofte bare metadata. Ikke-lovrelaterte proposisjoner (St.prp. etc.) er aldri fulltekst-indeksert.no_headings(frasection()) → dokumentet har ingen overskrifter. Brukgrep()ogpage().no_search_field/search_timeout(frasearch()) → fanen viser ikke Hurtigsøk-feltet, eller søket kom ikke gjennom. Bruk fallback-flyten i Steg 3.cors→ du kjørte JS i en fane som ikke er pålovdata.no. Sjekk at fanen faktisk viser enlovdata.no/pro-side (Steg 0).- Siden er ikke godkjent / brukeren avslo tilgangsforespørselen → fortell brukeren dette og stopp; ikke prøv å omgå det.
Ytelsesnotat
Hvert javascript_tool-svar går gjennom verktøykanalen og inn i samtalen —
returner aldri mer enn PAGE_SIZE (se toppen av lovdata_pro.js) fra ett
JS-kall. Bruk section/grep/page istedenfor å be om hele
__lp.cache[path].fullText direkte. Foretrekk browser_batch når du skal
navigere + lime inn scriptet + sjekke innlogging i samme tur.
Norsk-terminologiske notater
- Rettspraksis / rettsavgjørelse / dom — court decisions
- Forarbeider — preparatory works (collective term)
- NOU (Norges offentlige utredninger) — committee report
- Ot.prp. (Odelstingsproposisjon, brukt før 2009) — government bill
- Prop. L (Lovproposisjon, fra 2009) — government bill
- Innst. (Innstilling) — parliamentary committee recommendation
- Stikkord — keywords/index terms (Lovdata-metadata)
- Henvisninger — cross-references
- Avsnitt — paragraph (when citing modern Supreme Court, "avsnitt N" is the canonical paragraph reference)