portfolio-optimiser/docs/presentasjon-bygge-kunnskapsbase.html
Kjell Tore Guttormsen 56c48f6f65 feat(visibility): en lenke som ikke ble fulgt sier det - spor + betinget linje (ORDRE 20260821T142704Z)
okf._walk toleret en ulesbar/utenfor-basen lenke uten aa etterlate spor (okf.py:182
"continue  # broken link"), og navigate_bundle returnerte kun filene den FANT. En base
der halve innholdet aldri ble lest var derfor umulig aa skille fra en base der de
dokumentene aldri ble skrevet - og toerrkjoeringen sa ingenting.

Toleransen er UROERT: OKF SPEC §4 krever at navigasjonen ikke kaster, og den kaster
fortsatt ikke. Dette er synlighet, ikke en ny nekt.

To tenner (samme form som ordre 20260821T092039Z, synlig uforankring):

1. okf.SkippedLink + Bundle.skipped - strukturert spor, aldri en streng: hvilken fil
   lenken sto i, lenketeksten ORDRETT (operatoeren redigerer den teksten, ikke den
   resolverte stien), og hvilken av de TO grunnene som gjaldt - outside-bundle (escape,
   ofte bevisst) eller missing (inne i basen, ingen lesbar fil, nesten alltid en
   skrivefeil). Dedup-grenen (canonical in seen) registreres ALDRI: den er korrekt
   navigasjon og det som terminerer sykler.
2. run.skipped_links_notice - EN renderer, tar den alt opploeste tuppelen, returnerer
   None naar ingenting ble hoppet over. Printes paa BEGGE flater: --live-dry-run og
   den fulle enkeltkjoeringen (en kjoering som PRODUSERTE et forslag fra en halvlest
   base er der tausheten kostet mest).

Defaulten er MOTSATT forrige ordres, og forskjellen er innsikten: cost_baseline_anchored
er paakrevd fordi begge defaults lyver, mens en TOM tuppel her er et aerlig positivt
utsagn ("hver lenke ble fulgt") - external_calls-presedensen. Vei-stien navigerer ingen
base, saa tom er bokstavelig sant der ogsaa.

Sporet bor paa RunResult.skipped_links (RUN-nivaa: navigasjonen skjer EN gang per
kjoering, foer noe forslag finnes), aldri paa ProvenanceStamp, som beskriver gaten som
doemte EN kandidat. Ingenting av dette naar bundle_context - derfor er de commons-eide
nav-goldenene byte-uendret, og Bundle( har fortsatt EN konstruksjons-sted (maalt).

Load-bearing MAALT (tests/test_navigation_visibility_loadbearing.py), aatte mutasjoner
alle roede mot HELE suiten + groenn kontroll 897 passed / 5 skipped:
  detach missing-registreringen (6 roede) · detach outside-bundle (2) · kollaps de to
  grunnene til en (2) · registrer dedup-grenen (1) · renderer returnerer alltid linja
  (3, inkl. kontrollene - omisjonen er selv gatet) · detach dry-run-printen (1) ·
  detach full-run-printen (1) · konstant tom trace ut av run_project (4).

Docs rettet der de paasto det motsatte: kunnskapsbase-for-en-kjoring.md §5.7 + §6,
presentasjon-bygge-kunnskapsbase.html (steg 8, steg 9, fallgruve 3, avslutningen),
README-ens navigasjonsavsnitt, og CLAUDE.md-ens navigasjons-kontrakt-invariant.
2026-08-21 17:18:18 +02:00

475 lines
28 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="no">
<meta charset="utf-8">
<title>Slik bygger du kunnskapsbasen</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root { color-scheme: light; }
* { box-sizing: border-box; }
body { margin:0; background:#fff; color:#000;
font:17px/1.6 -apple-system, "Segoe UI", system-ui, sans-serif; }
.slide { display:none; min-height:100vh; padding:6vh 6vw 14vh; max-width:52rem; margin:0 auto; }
.slide.on { display:block; }
h1 { font-size:2.1rem; margin:0 0 .5em; line-height:1.2; }
h2 { font-size:1.5rem; margin:0 0 .9em; line-height:1.3; }
.kicker { color:#666; text-transform:uppercase; letter-spacing:.1em;
font-size:.72rem; margin:0 0 1.4em; }
.step { display:inline-block; border:2px solid #000; border-radius:4px;
padding:.05em .55em; font-weight:700; margin-right:.5em; }
p { margin:0 0 1em; }
ol, ul { padding-left:1.4em; margin:0 0 1em; }
li { margin:.5em 0; }
.lead { font-size:1.15rem; color:#444; }
table { border-collapse:collapse; width:100%; margin:1.2em 0; font-size:.94rem; }
th, td { border-bottom:1px solid #ddd; text-align:left; padding:.5em .6em; vertical-align:top; }
th { color:#666; font-weight:600; font-size:.78rem; text-transform:uppercase; letter-spacing:.04em; }
.done { border:2px solid #000; padding:.7em 1em; margin:1.4em 0; font-size:.95rem; }
.done b { display:block; font-size:.72rem; text-transform:uppercase; letter-spacing:.08em;
color:#666; margin-bottom:.25em; }
.note { border-left:3px solid #ccc; padding:.3em 0 .3em 1.1em; color:#444;
margin:1.4em 0; font-size:.95rem; }
figure { margin:1.6em 0; }
figure svg { width:100%; height:auto; display:block; }
figcaption { font-size:.82rem; color:#666; margin-top:.6em; text-align:center; }
nav { position:fixed; bottom:0; left:0; right:0; padding:.7em 6vw;
background:#fff; border-top:1px solid #ddd;
display:flex; gap:1em; align-items:center; font-size:.85rem; }
button { font:inherit; padding:.3em .9em; cursor:pointer; border:1px solid #bbb;
background:#fff; color:#000; border-radius:4px; }
#pos { color:#666; margin-left:auto; }
.d { fill:none; stroke:#000; stroke-width:2; }
.dt { fill:#000; font:13px -apple-system,"Segoe UI",system-ui,sans-serif; }
.dt-s { fill:#444; font:11px -apple-system,"Segoe UI",system-ui,sans-serif; }
.dim { stroke:#bbb; }
.dimt { fill:#999; font:12px -apple-system,"Segoe UI",system-ui,sans-serif; }
.fill { fill:#000; }
.hatch { fill:#eee; stroke:#000; stroke-width:2; }
</style>
<section class="slide on">
<p class="kicker">Optimaliseringsprosjekt</p>
<h1>Slik bygger du kunnskapsbasen</h1>
<p class="lead">Ni steg fra ingenting til en kunnskapsbase som kan kjøres. Hvert steg sier hvem
som gjør det, hva som leveres, og når du er ferdig med det.</p>
<p>Kunnskapsbasen er den lille, kuraterte samlingen systemet leser før det foreslår tiltak.
Uten den vet systemet ingenting om anlegget ditt.</p>
<figure>
<svg viewBox="0 0 720 118" role="img" aria-label="Ni steg fordelt på fire faser">
<rect class="d" x="8" y="26" width="150" height="52" rx="4"/>
<text class="dt" x="83" y="48" text-anchor="middle" font-weight="700">Ramme</text>
<text class="dt-s" x="83" y="66" text-anchor="middle">steg 13</text>
<path class="d" d="M158 52 h20"/><path class="fill" d="M186 52 l-10 -5 v10 z"/>
<rect class="d" x="186" y="26" width="150" height="52" rx="4"/>
<text class="dt" x="261" y="48" text-anchor="middle" font-weight="700">Innhold</text>
<text class="dt-s" x="261" y="66" text-anchor="middle">steg 46</text>
<path class="d" d="M336 52 h20"/><path class="fill" d="M364 52 l-10 -5 v10 z"/>
<rect class="d" x="364" y="26" width="150" height="52" rx="4"/>
<text class="dt" x="439" y="48" text-anchor="middle" font-weight="700">Bind sammen</text>
<text class="dt-s" x="439" y="66" text-anchor="middle">steg 78</text>
<path class="d" d="M514 52 h20"/><path class="fill" d="M542 52 l-10 -5 v10 z"/>
<rect class="d" x="542" y="26" width="170" height="52" rx="4"/>
<text class="dt" x="627" y="48" text-anchor="middle" font-weight="700">Kjør og lær</text>
<text class="dt-s" x="627" y="66" text-anchor="middle">steg 9</text>
<text class="dimt" x="360" y="108" text-anchor="middle">samlet: én til to uker, og det tunge er steg 2</text>
</svg>
</figure>
</section>
<section class="slide">
<p class="kicker">Før du starter</p>
<h2>To roller, og de kan ikke bytte plass</h2>
<figure>
<svg viewBox="0 0 720 165" role="img" aria-label="Fagpersonen eier innholdet, den tekniske personen eier formen">
<rect class="d" x="8" y="14" width="340" height="130" rx="4"/>
<text class="dt" x="178" y="42" text-anchor="middle" font-weight="700">FAGPERSONEN</text>
<path class="d dim" d="M40 54 h276"/>
<text class="dt-s" x="178" y="78" text-anchor="middle">eier innholdet og korrektheten</text>
<text class="dt-s" x="178" y="98" text-anchor="middle">tallene, rammene, tiltakene, dommene</text>
<text class="dt-s" x="178" y="126" text-anchor="middle">leverer i den formen de allerede jobber i</text>
<rect class="d" x="372" y="14" width="340" height="130" rx="4"/>
<text class="dt" x="542" y="42" text-anchor="middle" font-weight="700">DEN TEKNISKE PERSONEN</text>
<path class="d dim" d="M404 54 h276"/>
<text class="dt-s" x="542" y="78" text-anchor="middle">eier formen og strukturen</text>
<text class="dt-s" x="542" y="98" text-anchor="middle">oversetter til dokumenter og tall</text>
<text class="dt-s" x="542" y="126" text-anchor="middle">finner aldri opp et tall selv</text>
</svg>
</figure>
<p>Fagpersonen leverer regneark, notater og henvisninger — ikke ferdige dokumenter. Den tekniske
personen oversetter. <strong>Regelen som ikke kan brytes: den tekniske personen utleder aldri et
tall fagpersonen ikke har oppgitt.</strong> Mangler et tall, står det som mangler.</p>
<div class="note">Det finnes ingen automatikk som gjør denne jobben. Oversettelsen er håndarbeid,
og det er derfor det tar én til to uker.</div>
</section>
<section class="slide">
<p class="kicker">Ramme</p>
<h2><span class="step">1</span> Bestem hvilket anlegg det gjelder</h2>
<p>Én kunnskapsbase dekker <strong>ett</strong> prosjekt eller anlegg. Har du flere, blir det
flere baser — ikke én stor.</p>
<p><strong>Gjør dette:</strong> velg et navn på anlegget og skriv det ned ett sted. Navnet skal
brukes helt likt overalt siden, uten mellomrom og uten æ, ø og å.</p>
<table>
<tr><th>Hvem</th><th>Leverer</th></tr>
<tr><td>Prosjekteier</td><td>hvilket anlegg, og hva det skal hete</td></tr>
</table>
<div class="done"><b>Ferdig når</b>Navnet er bestemt, og alle er enige om at basen dekker akkurat
dette anlegget — ikke to naboanlegg «mens vi først er i gang».</div>
</section>
<section class="slide">
<p class="kicker">Ramme</p>
<h2><span class="step">2</span> Skaff de faktiske kostnadstallene</h2>
<p>Dette er det tunge steget, og det som avgjør om resten er verdt noe. Systemet skal senere
kontrollere hvert forslag mot ekte kostnadslinjer — mengde ganger enhetspris.</p>
<figure>
<svg viewBox="0 0 720 150" role="img" aria-label="Med kostnadstall avvises et oppdiktet forslag; uten dem passerer det">
<text class="dt" x="8" y="22" font-weight="700">MED ekte tall</text>
<rect class="d" x="8" y="32" width="120" height="40" rx="4"/>
<text class="dt-s" x="68" y="56" text-anchor="middle">Oppdiktet forslag</text>
<path class="d" d="M128 52 h30"/><path class="fill" d="M168 52 l-11 -5 v10 z"/>
<rect class="d" x="168" y="32" width="150" height="40" rx="4" stroke-width="3"/>
<text class="dt-s" x="243" y="56" text-anchor="middle">Avstemmes mot fasit</text>
<path class="d" d="M318 52 h30"/><path class="fill" d="M358 52 l-11 -5 v10 z"/>
<text class="dt" x="370" y="57" font-weight="700">AVVIST</text>
<text class="dt" x="8" y="112" font-weight="700">UTEN ekte tall</text>
<rect class="d" x="8" y="122" width="120" height="0" rx="4"/>
<rect class="d" x="8" y="102" width="120" height="40" rx="4"/>
<text class="dt-s" x="68" y="126" text-anchor="middle">Oppdiktet forslag</text>
<path class="d" d="M128 122 h30"/><path class="fill" d="M168 122 l-11 -5 v10 z"/>
<rect class="d dim" x="168" y="102" width="150" height="40" rx="4" stroke-dasharray="6 5"/>
<text class="dimt" x="243" y="126" text-anchor="middle">ingenting å avstemme mot</text>
<path class="d" d="M318 122 h30"/><path class="fill" d="M358 122 l-11 -5 v10 z"/>
<text class="dt" x="370" y="127" font-weight="700">GODKJENT</text>
<text class="dimt" x="440" y="127">— og kjøringen ser helt normal ut</text>
</svg>
</figure>
<p><strong>Gjør dette:</strong> list opp hver kostnadslinje tiltakene kan komme til å treffe, med
mengde og enhetspris. Ikke bare linjen til det tiltaket du tror på — alle linjene som er i spill.</p>
<p><strong>Ta ikke med tall du ikke har.</strong> Har dere ingen kilde på hva noe koster per enhet,
skal linjen utelates. En utledet verdi hører ikke hjemme her.</p>
<div class="done"><b>Ferdig når</b>Hver linje har en mengde og en enhetspris, og du kan si hvor
hvert tall kom fra. Får du ikke tak i tallene: skriv uttrykkelig at kjøringen blir uforankret, så
ingen leser et godkjent-resultat som mer enn det er.</div>
</section>
<section class="slide">
<p class="kicker">Ramme</p>
<h2><span class="step">3</span> Skriv ned hva som allerede er gjort</h2>
<p>Systemet vet ingenting om anlegget utover det basen sier. Er noe allerede bygget om, og det
ikke står noe sted, vil systemet foreslå det på nytt — og love en besparelse som allerede er tatt ut.</p>
<figure>
<svg viewBox="0 0 720 130" role="img" aria-label="Gjennomførte tiltak hører i anleggsbeskrivelsen, tidligere vurderinger i erfaringslaget">
<rect class="d" x="8" y="14" width="340" height="100" rx="4"/>
<text class="dt" x="178" y="42" text-anchor="middle" font-weight="700">Gjennomførte tiltak</text>
<text class="dt-s" x="178" y="66" text-anchor="middle">hva som faktisk er bygget om,</text>
<text class="dt-s" x="178" y="84" text-anchor="middle">når, og på hvor mye av anlegget</text>
<text class="dt-s" x="178" y="106" text-anchor="middle">→ inn i anleggsbeskrivelsen</text>
<rect class="d" x="372" y="14" width="340" height="100" rx="4"/>
<text class="dt" x="542" y="42" text-anchor="middle" font-weight="700">Tidligere vurderinger</text>
<text class="dt-s" x="542" y="66" text-anchor="middle">hva fagfolk mente om et forslag,</text>
<text class="dt-s" x="542" y="84" text-anchor="middle">og hvor mye som faktisk ble realisert</text>
<text class="dt-s" x="542" y="106" text-anchor="middle">→ inn i erfaringslaget (steg 7)</text>
</svg>
</figure>
<p><strong>Gjør dette:</strong> lag en kort liste over gjennomførte tiltak, og sørg for at
kostnadstallene fra steg 2 viser <em>dagens</em> situasjon — ikke situasjonen før forrige tiltak.</p>
<div class="done"><b>Ferdig når</b>Ingen kan peke på et tiltak som er gjennomført uten å stå i
basen, og kostnadstallene stemmer med hva anlegget bruker i dag.</div>
</section>
<section class="slide">
<p class="kicker">Innhold</p>
<h2><span class="step">4</span> Beskriv anlegget og rammene</h2>
<p>Ett kort dokument som svarer: hva er dette anlegget, hva består det av, og hva kan
<em>ikke</em> fravikes?</p>
<p><strong>Rammene er den viktigste halvdelen.</strong> Uten dem foreslår systemet tiltak som
bryter krav ingen har fortalt det om — og fagpersonen må bruke tid på å avvise det samme igjen
og igjen.</p>
<table>
<tr><th>Ta med</th><th>Eksempeltype</th></tr>
<tr><td>Hva anlegget består av</td><td>antall enheter, alder, tilstand, kapasitet</td></tr>
<tr><td>Dagens forbruk eller kostnad</td><td>gulvet ingen besparelse kan gå under</td></tr>
<tr><td>Krav som ikke kan fravikes</td><td>minstekrav, sikkerhetskrav, avtalefestede nivåer</td></tr>
<tr><td>Antakelser som ikke holder</td><td>«vi kan ikke forutsette at X er mulig her»</td></tr>
</table>
<div class="done"><b>Ferdig når</b>En fagperson som ikke kjenner anlegget kan lese dokumentet og
vite hva som er lov å foreslå.</div>
</section>
<section class="slide">
<p class="kicker">Innhold</p>
<h2><span class="step">5</span> Skriv tiltaksnotatene</h2>
<p>Ett kort notat per kandidat-tiltak. Systemet skal <em>forbedre</em> disse, ikke finne opp sine
egne fra bunnen — så jo mer konkrete de er, jo bedre blir svaret.</p>
<p><strong>Hvert notat skal ha:</strong> hva tiltaket går ut på, hvilke kostnadslinjer det virker
på, hvor mye det er beregnet å spare, hva som er usikkert, og hva som er utledet framfor målt.</p>
<p><strong>Trenger du hjelp til å finne kandidatene?</strong> For de fleste anleggstyper finnes
det et ganske stabilt sett tiltakstyper — utskifting til nyere teknologi, behovsstyring framfor
fast drift, tilstandsbasert vedlikehold framfor intervallbasert, og levetidsforlengelse framfor
utskifting. Fagmiljøet har listen for sin type; jobben er å avgjøre hvilke som er aktuelle her.</p>
<div class="note"><strong>Filteret som avgjør:</strong> et tiltak må kunne uttrykkes som en
kostnadslinje — en mengde ganger en enhetspris. Kan det ikke det, kan systemet foreslå det, men
ikke kontrollere det. Da er svaret verdt akkurat like mye som et vanlig godt råd.</div>
<div class="done"><b>Ferdig når</b>Hvert notat peker på kostnadslinjer som finnes i steg 2, og
det er tydelig merket hva som er målt og hva som er antatt.</div>
</section>
<section class="slide">
<p class="kicker">Innhold</p>
<h2><span class="step">6</span> Velg det ene tiltaket som skal regnes på</h2>
<p>Én kandidat får en egen, presis form som den deterministiske kontrollen kan konsumere:
kostnadslinjene den virker på, den beregnede besparelsen, og et usikkerhetsbånd.</p>
<p><strong>Denne kandidaten er også nøkkelen til tidligere erfaring</strong> — det er dens
kostnadslinjer og størrelsesorden som avgjør hvilke tidligere dommer systemet henter fram.</p>
<figure>
<svg viewBox="0 0 720 120" role="img" aria-label="Den regnede kandidaten og kostnadsgrunnlaget skrives fra samme regnestykke">
<rect class="d" x="200" y="8" width="320" height="40" rx="4" stroke-width="3"/>
<text class="dt" x="360" y="33" text-anchor="middle" font-weight="700">Ett regnestykke</text>
<path class="d" d="M300 48 C 300 68, 180 68, 180 82"/><path class="fill" d="M180 92 l-5 -11 h10 z"/>
<path class="d" d="M420 48 C 420 68, 540 68, 540 82"/><path class="fill" d="M540 92 l-5 -11 h10 z"/>
<rect class="d" x="50" y="92" width="260" height="24" rx="4"/>
<text class="dt-s" x="180" y="109" text-anchor="middle">Kostnadsgrunnlaget (steg 2)</text>
<rect class="d" x="410" y="92" width="260" height="24" rx="4"/>
<text class="dt-s" x="540" y="109" text-anchor="middle">Den regnede kandidaten</text>
</svg>
<figcaption>Samme kostnadslinje, samme mengde, samme enhetspris — skrevet ut fra ett regnestykke.</figcaption>
</figure>
<div class="done"><b>Ferdig når</b>Kandidaten og kostnadsgrunnlaget bærer nøyaktig samme tall for
de linjene de deler. Er de skrevet inn hver for seg, blir et lite avvik bare slurv — ikke et signal.</div>
</section>
<section class="slide">
<p class="kicker">Bind sammen</p>
<h2><span class="step">7</span> Legg inn metode, kilder og første erfaring</h2>
<p>Tre korte dokumenter som gjør forskjellen mellom et tall og et troverdig tall.</p>
<table>
<tr><th>Dokument</th><th>Hvem</th><th>Svarer på</th></tr>
<tr><td><strong>Metode</strong></td><td>fagmiljøet</td>
<td>hvordan skal effekten måles i etterkant — og hvilke metoder er stengt for dette anlegget?</td></tr>
<tr><td><strong>Kilder</strong></td><td>fagmiljøet</td>
<td>hva sier litteraturen om avviket mellom beregnet og faktisk effekt? Med årstall og opphav.</td></tr>
<tr><td><strong>Første erfaring</strong></td><td>fageksperten</td>
<td>hva pleier å skje? «Forvent rundt X prosent av beregnet, fordi …»</td></tr>
</table>
<p><strong>Skill eget materiale fra lånt.</strong> Har dere ingen egne målinger og må låne et tall
fra litteraturen, skal det stå uttrykkelig at det er lånt. Det er ikke en svakhet — det er det som
gjør at neste person kan vurdere om lånet holder.</p>
<div class="done"><b>Ferdig når</b>Hvert tall som ikke er målt hos dere, har en navngitt kilde
ved siden av seg.</div>
</section>
<section class="slide">
<p class="kicker">Bind sammen</p>
<h2><span class="step">8</span> Skriv innholdsfortegnelsen som binder alt</h2>
<p>Systemet <strong>navigerer</strong>, det søker ikke. Det starter i innholdsfortegnelsen, følger
lenkene derfra, og leser hvert dokument det når — helt, eller ikke i det hele tatt.</p>
<figure>
<svg viewBox="0 0 720 180" role="img" aria-label="Innholdsfortegnelsen lenker til dokumentene; et dokument uten lenke nås aldri">
<rect class="d" x="30" y="60" width="130" height="56" rx="4"/>
<text class="dt" x="95" y="83" text-anchor="middle">Innholds-</text>
<text class="dt" x="95" y="101" text-anchor="middle">fortegnelse</text>
<rect class="d" x="290" y="14" width="180" height="34" rx="4"/>
<text class="dt-s" x="380" y="35" text-anchor="middle">Anlegg og rammer</text>
<rect class="d" x="290" y="58" width="180" height="34" rx="4"/>
<text class="dt-s" x="380" y="79" text-anchor="middle">Tiltaksnotater</text>
<rect class="d" x="290" y="102" width="180" height="34" rx="4"/>
<text class="dt-s" x="380" y="123" text-anchor="middle">Metode og kilder</text>
<path class="d" d="M160 82 C 210 82, 230 31, 280 31"/><path class="fill" d="M290 31 l-11 -5 v10 z"/>
<path class="d" d="M160 88 h120"/><path class="fill" d="M290 75 l-11 -5 v10 z"/>
<path class="d" d="M160 94 C 210 94, 230 119, 280 119"/><path class="fill" d="M290 119 l-11 -5 v10 z"/>
<rect class="hatch" x="30" y="132" width="180" height="34" rx="4" stroke-dasharray="5 4"/>
<text class="dimt" x="120" y="153" text-anchor="middle">dokument uten lenke — finnes ikke</text>
<rect class="d dim" x="530" y="58" width="160" height="34" rx="4" stroke-dasharray="5 4"/>
<text class="dimt" x="610" y="79" text-anchor="middle">annen base</text>
<path class="d dim" d="M470 75 h44" stroke-dasharray="6 5"/>
<path class="d" d="M480 63 l22 24 M502 63 l-22 24" stroke-width="2.5"/>
<text class="dimt" x="610" y="112" text-anchor="middle">lenker ut følges aldri</text>
</svg>
</figure>
<p><strong>Gjør dette:</strong> skriv et kort avsnitt om hva prosjektet er og hvorfor dette
fagområdet er valgt — det er det aller første systemet leser — og lenk til hvert eneste dokument
du vil at det skal se.</p>
<div class="done"><b>Ferdig når</b>Hvert dokument du har laget er lenket. Et dokument uten lenke
eksisterer ikke, uansett hvor det ligger. Og trenger du fagstoff fra en annen base: kopier det
inn — lenker ut av basen følges aldri, men tørrkjøringen lister dem, så du ser at det skjedde.</div>
</section>
<section class="slide">
<p class="kicker">Kjør og lær</p>
<h2><span class="step">9</span> Sjekk at basen åpner, så kjør</h2>
<p>Kjør en tørrkjøring først. Den går hele veien fram til det første kallet mot språkmodellen og
stopper der — den koster ingenting, og kan kjøres hver gang basen endres.</p>
<table>
<tr><th>Tørrkjøringen beviser</th><th>Den beviser ikke</th></tr>
<tr><td>at basen åpner</td><td>at innholdet er godt</td></tr>
<tr><td>at navnet stemmer overalt</td><td>at forslagene blir kloke</td></tr>
<tr><td>at kostnadsgrunnlaget er lesbart</td><td>at alt du laget faktisk er lenket</td></tr>
<tr><td>hvilke lenker den ikke klarte å følge</td><td></td></tr>
<tr><td>at ingen ekstern tjeneste kontaktes</td><td></td></tr>
</table>
<p>Mangler kostnadsgrunnlaget, sier tørrkjøringen fra. Er en lenke brutt, stopper den fortsatt
ikke kjøringen — men den skrives ut, med dokumentet den pekte på og hvorfor den ikke ble fulgt
(<code>missing</code> = ingen fil der, <code>outside-bundle</code> = peker ut av basen). Er alle
lenker fulgt, står det ingenting. Den feilen den fortsatt ikke kan se, er dokumentet
<em>ingen</em> lenker til — da finnes det ingen lenke å rapportere.</p>
<div class="done"><b>Ferdig når</b>Tørrkjøringen er grønn, den lister ingen lenker den ikke fulgte,
og du har lest gjennom listen over dokumenter den faktisk fant.</div>
</section>
<section class="slide">
<p class="kicker">Kjør og lær</p>
<h2>Etter kjøringen: dommen tilbake i basen</h2>
<figure>
<svg viewBox="0 0 720 210" role="img" aria-label="Kjøring gir forslag, fagperson dømmer, dommen leses av neste kjøring">
<rect class="d" x="30" y="24" width="150" height="46" rx="4"/>
<text class="dt" x="105" y="52" text-anchor="middle">Kjøring</text>
<path class="d" d="M180 47 h64"/><path class="fill" d="M254 47 l-11 -5 v10 z"/>
<rect class="d" x="254" y="24" width="180" height="46" rx="4"/>
<text class="dt" x="344" y="44" text-anchor="middle">Forslag + kontroll</text>
<text class="dt-s" x="344" y="62" text-anchor="middle">ett per vurdert tilnærming</text>
<path class="d" d="M434 47 h64"/><path class="fill" d="M508 47 l-11 -5 v10 z"/>
<rect class="d" x="508" y="24" width="182" height="46" rx="4" stroke-width="3"/>
<text class="dt" x="599" y="44" text-anchor="middle" font-weight="700">Fagperson dømmer</text>
<text class="dt-s" x="599" y="62" text-anchor="middle">godkjent / avvist / korrigert</text>
<path class="d" d="M599 70 v42 H344"/><path class="fill" d="M344 112 l11 -5 v10 z"/>
<rect class="d" x="254" y="112" width="180" height="46" rx="4"/>
<text class="dt" x="344" y="140" text-anchor="middle">Innboks</text>
<path class="d" d="M254 135 H105 V76"/><path class="fill" d="M105 70 l-5 11 h10 z"/>
<text class="dt-s" x="118" y="105">leses før neste forslag</text>
<text class="dimt" x="360" y="192" text-anchor="middle">systemet leser innboksen — mennesket skriver den</text>
</svg>
</figure>
<p>Neste kjøring leser dommene <em>før</em> den former sitt forslag. Dommen påvirker altså det
neste forslaget, ikke bare arkivet. Godkjennes en dom for varig bruk, løftes den inn i basen.</p>
<div class="note"><strong>Regelen som ikke kan brytes:</strong> systemet leser innboksen,
mennesket skriver den. En kjøring lagrer aldri sin egen vurdering tilbake som kunnskap — ellers
ville systemet lært av seg selv.</div>
</section>
<section class="slide">
<p class="kicker">Underveis</p>
<h2>Må systemet spørre andre fagsystemer?</h2>
<p>Utgangspunktet er <strong>ingen integrasjon</strong>: uten konfigurasjon gjøres null
nettverkskall. Trenger du likevel data fra et annet system, er det to helt ulike veier — og valget
avgjøres av <em>når</em> svaret trengs.</p>
<table>
<tr><th></th><th>Hent på forhånd</th><th>Slå opp underveis</th></tr>
<tr><td>Når</td><td>før kjøringen</td><td>mens forslaget formes</td></tr>
<tr><td>Blir</td><td>et dokument i basen</td><td>et verktøy systemet kan kalle</td></tr>
<tr><td>Fordel</td><td>fagpersonen kan lese og korrigere det først</td><td>fanger opp noe som endrer seg</td></tr>
<tr><td>Krever</td><td>opphav og dato på dokumentet</td><td>uttrykkelig liste over tillatte kall</td></tr>
<tr><td>Nettverk under kjøring</td><td>null</td><td>ja, og alt navngis på forhånd</td></tr>
</table>
<p><strong>Velg «hent på forhånd» hvis du kan.</strong> Det er billigere, det kan kvalitetssikres
av et menneske, og det gjør at du kan si nøyaktig hva en kjøring har rørt.</p>
</section>
<section class="slide">
<p class="kicker">Sjekkliste</p>
<h2>Hvem leverer hva</h2>
<table>
<tr><th>Steg</th><th>Hvem</th><th>Leveranse</th></tr>
<tr><td>1</td><td>Prosjekteier</td><td>anlegg og navn</td></tr>
<tr><td><strong>2</strong></td><td><strong>Drift / økonomi</strong></td><td><strong>kostnadslinjer med mengde og enhetspris</strong></td></tr>
<tr><td>3</td><td>Drift</td><td>liste over allerede gjennomførte tiltak</td></tr>
<tr><td>4</td><td>Prosjekteier + fagmiljø</td><td>anleggsbeskrivelse og rammer</td></tr>
<tr><td>5</td><td>Drift + fagmiljø</td><td>kandidat-tiltak med parametere</td></tr>
<tr><td>6</td><td>Teknisk person</td><td>den ene kandidaten i presis form</td></tr>
<tr><td>7</td><td>Fagmiljø + fagekspert</td><td>metode, kilder, første erfaring</td></tr>
<tr><td>8</td><td>Teknisk person</td><td>innholdsfortegnelsen med alle lenker</td></tr>
<tr><td>9</td><td>Teknisk person</td><td>tørrkjøring, så kjøring</td></tr>
</table>
<p>Steg 2 er markert fordi det er det som stopper prosjekter. Alt annet kan skrives på en dag
hvis fagpersonene er tilgjengelige.</p>
</section>
<section class="slide">
<p class="kicker">Fallgruver</p>
<h2>De fem feilene som koster mest</h2>
<ol>
<li><strong>Ingen kostnadstall.</strong> Kjøringen går, resultatet ser normalt ut, og kontrollen
dømmer bare mot tall forslaget fant på selv. Dette er den dyreste feilen, fordi den er usynlig.</li>
<li><strong>Gjennomførte tiltak står ikke i basen.</strong> Systemet foreslår dem på nytt, og
besparelsen dobbelttelles.</li>
<li><strong>Dokumenter uten lenke.</strong> De leses aldri, og ingen feilmelding sier fra —
for det finnes ingen lenke å klage på. Er lenken der, men feil, sier tørrkjøringen nå fra;
er den aldri skrevet, er dokumentet usynlig. Symptomet er at forslagene virker uinformerte
uten at noen skjønner hvorfor.</li>
<li><strong>For mye materiale.</strong> Alt som lenkes leses i sin helhet. Ti sider støy koster
like mye oppmerksomhet som ti sider substans.</li>
<li><strong>Utledede tall.</strong> Et tall ingen kan peke på en kilde for, forurenser alt som
bygger på det. Mangler et tall, skal det stå som manglende.</li>
</ol>
</section>
<section class="slide">
<p class="kicker">Til slutt</p>
<h2>Hva dette lover — og ikke lover</h2>
<ul>
<li><strong>Én til to uker</strong> for en god base. Det tunge er ikke teknikken, men å få tak i
kostnadstallene og å få en fagperson til å skrive ned rammene sine.</li>
<li><strong>Det finnes ingen automatikk</strong> som lager basen av regnearkene deres. Det er
håndarbeid, og det er derfor det tar tid.</li>
<li><strong>Det finnes ingen «er basen klar»-knapp.</strong> Tørrkjøringen er det nærmeste: den
sier fra om kostnadsgrunnlaget mangler og lister lenkene den ikke klarte å følge, men den sier
ingenting om et dokument ingen har lenket til, og ingenting om innholdet er godt.</li>
<li><strong>Systemet dømmer ikke.</strong> Det foreslår og kontrollerer regnestykket.
Vurderingen av om tiltaket er klokt, gjør fagpersonen — og den vurderingen er det basen lærer av.</li>
</ul>
<div class="note">Basen blir bedre for hver kjøring, men bare hvis noen faktisk avgir dommen
etterpå. En base ingen dømmer imot, står stille.</div>
</section>
<nav>
<button id="prev">← Forrige</button>
<button id="next">Neste →</button>
<span id="pos"></span>
</nav>
<script>
const slides = document.querySelectorAll('.slide');
let i = 0;
function show(n) {
i = Math.max(0, Math.min(slides.length - 1, n));
slides.forEach((s, k) => s.classList.toggle('on', k === i));
document.getElementById('pos').textContent = (i + 1) + ' / ' + slides.length;
window.scrollTo(0, 0);
}
document.getElementById('prev').onclick = () => show(i - 1);
document.getElementById('next').onclick = () => show(i + 1);
document.addEventListener('keydown', e => {
if (e.key === 'ArrowRight' || e.key === 'PageDown' || e.key === ' ') show(i + 1);
if (e.key === 'ArrowLeft' || e.key === 'PageUp') show(i - 1);
});
show(0);
</script>
</html>