Særlig uavhengige stillinger

Et ukentlig tekstsøk i norske stillingsannonser etter stillinger som markedsføres som unntatt arbeidstidsreglene (aml. § 10-12)

Utgitt

today

The empirical object

NoteSammendrag

Denne siden skiller mellom AI-ens kapasitet (eksponering, fra Eloundou m.fl.) og den faktiske bruken (adopsjon). Hovedfunnet er at gapet mellom dem først og fremst bestemmes av brukerkostnaden ved å ta AI i bruk — ikke av hvor god modellen er. Brukerkostnaden er kostnaden ved å bruke AI trygt og pålitelig: menneskelig tid til å kontrollere og godkjenne resultatet, pluss etterlevelse, personvern og integrasjon. Høy lønn trekker AI inn, mens høy brukerkostnad holder den ute.

I norske stillingsannonser (NAV) nevnes AI fortsatt i et lite mindretall av annonsene (rundt 5 %, målt over hele annonseteksten) og er konsentrert i få yrker. Eksponering forklarer bare svakt hvilke yrker som faktisk etterspør AI; det er lønnseffekten som overlever ut-av-utvalg-testing, mens en oppgave-for-oppgave-splitt av brukerkostnaden ennå ikke lar seg identifisere med så tynne data. SSBs egne tall peker samme vei: bruken stiger mens kostnadsbarrieren faller.

Den estimerte brukerkostnaden er ikke målt direkte, men et estimat fra en økonomisk strukturell modell basert på Lindenlaub og medforfattere (Lindenlaub, Oh, Rodríguez & Veldkamp 2026, «LORV»), der komparative fortrinn — ikke kapasitet alene — avgjør hvilke yrker som tar AI i bruk.

Two numbers get attached to every occupation in the AI-and-jobs debate:

  • Exposure — how much of the work AI is technically capable of doing (Eloundou et al.).
  • Adoption — how much AI is actually being used or asked for.

They are not the same object, and the gap between them is the interesting one. This page tracks both for the Norwegian labour market — exposure from Statistics Norway (SSB) occupational data, adoption from a weekly snapshot of open vacancies at arbeidsplassen.nav.no — and argues that what drives the gap is the user cost of putting AI to work.

Why user cost? A comparative-advantage story

The same 200-year-old logic that governs trade governs this. A firm puts AI on a task only when AI is cheaper per unit of output than the worker — productivity weighed against price — not whenever AI is merely able:

\[\underbrace{\frac{Z^{\text{AI}}_k}{r_k}}_{\text{AI's value for money}} \;>\; \underbrace{\frac{Z^{\text{worker}}_k}{w}}_{\text{the worker's value for money}}\]

The denominator on the left, the user cost \(r_k\), is the whole story. It is not the price of compute alone — it is the cost of using AI safely and reliably: the human time to check and sign off on the output, plus compliance, privacy and integration:

\[r_k \;\approx\; \rho_k \;+\; w\, t^{V}_k .\]

So a task can be highly exposed yet barely adopted because \(r_k\) is high (verification, accountability, regulation); and high wages \(w\) pull AI in, because they lower the worker’s value-for-money on the right. Capability is half the story; the cost of using AI is the other half — and it is an organisational and institutional variable, not a property of the model. This is the central finding of Lindenlaub, Oh, Rodríguez & Veldkamp (2026, “LORV”): across occupations, user cost — not capability — explains most of who actually adopts AI. The exposure measure is from Eloundou et al. (2024), and the task-chain logic below from Demirer, Horton, Immorlica & Lucier (2026).

How the cost cascades

The user cost is not fixed. When consecutive tasks are handed to AI, they chain — the interior steps run machine-to-machine and a human verifies only the end of the chain. So verification becomes roughly a fixed cost per chain, not per step: as AI grows reliable and chains lengthen, the cost per task falls, and augmentation can tip toward replacement.

Figur 1: A job is a sequence of tasks. AI is used on a task when its value-for-money beats the worker’s; the binding cost is verification, which is paid once per AI chain, not per step. After Demirer, Horton, Immorlica & Lucier (2026), “Chaining Tasks.”

Data & method

  • Adoption, narrowcollect.py pulls the open vacancies from NAV’s public search API once a week and flags AI with an audited bilingual lexicon (Norwegian + English phrases, brand names, and uppercase-only abbreviations so “ML” ≠ millilitre) on each ad’s title + NAV tag fields. One timestamped snapshot is archived per run; the share by occupation feeds the figures below.
  • Adoption, broad — the search API does not expose ad bodies, so fetch_bodies.py retrieves each ad’s full text from its public posting page (fetch-once per ad, cached) and applies the same lexicon. A title/tag mention means the role is about AI; a body-only mention is usually AI as a tool or workplace fact (“vi bruker KI-verktøy”) — closer to exposure-in-practice than to AI being the job.
  • Exposure / employment / wages — from Statistics Norway (SSB): occupational employment (table 12542) and monthly earnings (table 11418). ssb_check.py runs weekly and flags when SSB refreshes either table, so the bundled occupational panel can be re-pulled.
NoteRead these as descriptive, directional facts

Vacancy AI-mentions are demand-side signals (what employers advertise), not realised worker use; the snapshot is a recency-capped slice of open postings; mentions are a small minority (~5% of full ad texts) and concentrated in a few occupations. So the cross-section orders occupations loosely and the weekly series is what to watch. The structural “user cost by task” object needs worker-level / register adoption to identify — this tracker is the first ingredient.

What the Norwegian vacancies show

Load the latest weekly snapshot + SSB exposure, and merge
import json, re
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def md(s):
    from IPython.display import Markdown
    return Markdown(s)

KOJA = {"fjord": "#5d79a0", "amber": "#cf9a5c", "mist": "#b1abb0",
        "muted": "#8292ad", "heading": "#e7ecf3"}
plt.rcParams.update({
    "figure.facecolor": "none", "axes.facecolor": "none", "savefig.facecolor": "none",
    "savefig.transparent": True, "text.color": KOJA["mist"], "axes.labelcolor": KOJA["mist"],
    "axes.edgecolor": "#3a4860", "xtick.color": KOJA["muted"], "ytick.color": KOJA["muted"],
    "axes.titlecolor": KOJA["heading"], "axes.grid": True, "grid.color": "#8292ad",
    "grid.alpha": 0.15, "font.size": 11,
})

D = "adoption-tracker/data"
latest = json.load(open(f"{D}/latest.json"))
# Headline measure = AI mentioned anywhere in the FULL AD TEXT (body), not just the title/tags.
wbody = pd.read_csv(f"{D}/adoption_weekly_body.csv").sort_values("date")   # full-ad-text weekly series
wlast = wbody.iloc[-1]
# occupation cross-section on the full-ad-text measure (share_body = AI mentioned in the ad body)
occ = pd.read_csv(f"{D}/adoption_by_occupation_body.csv")
occ = occ[occ.date == occ.date.max()].copy()
occ["ai_share"] = occ.share_body.astype(float)     # full ad text, per occupation
occ["n_eff"] = occ.n_matched.astype(int)           # ads whose body was retrieved (the denominator)

def norm(s):
    s = str(s).lower().strip().replace("–", "-"); s = re.sub(r"\s+", " ", s)
    return re.sub(r"\s*([/-])\s*", r"\1", re.sub(r"[.;]+$", "", s))

ex = pd.read_csv(f"{D}/exposure_reference.csv")
ex["key"] = ex.occupation_title.map(norm); ex = ex.dropna(subset=["ai_exposure"]).drop_duplicates("key")
occ["key"] = occ.styrk.map(norm)
m = occ.merge(ex[["key", "ai_exposure", "wage_nok_monthly"]], on="key", how="inner")

As of the latest snapshot (2026-08-13), 10,000 open vacancies were collected (of 14,375 open). Scanning the full ad text, 460 mention AI (4.6%) of the 10,000 ads whose body was retrieved. AI demand is still rare and concentrated — which is exactly what a high-user-cost world looks like.

Kode
d = m[m.n_eff >= 15].copy()
x, y, w = d.ai_exposure.values, d.ai_share.values * 100, d.n_eff.values.astype(float)
W = w / w.sum(); xb, yb = np.average(x, weights=W), np.average(y, weights=W)
b1 = np.sum(W * (x - xb) * (y - yb)) / np.sum(W * (x - xb) ** 2); b0 = yb - b1 * xb
r2 = 1 - np.sum(W * (y - (b0 + b1 * x)) ** 2) / np.sum(W * (y - yb) ** 2)

fig, ax = plt.subplots()
ax.scatter(x, y, s=np.sqrt(w) * 7, alpha=.45, color=KOJA["fjord"], edgecolor="none")
xs = np.linspace(x.min(), x.max(), 50); ax.plot(xs, b0 + b1 * xs, color=KOJA["amber"], lw=2)
ax.set_xlabel("AI exposure (Eloundou index, 0–1)")
ax.set_ylabel("Vacancy-adoption: % of ads mentioning AI (full text)")
ax.set_title(f"Exposure vs vacancy-adoption  (N={len(d)} occ, R²={r2:.2f})")
plt.tight_layout(); plt.show()
Figur 2: Does exposure predict adoption? Each dot is a Norwegian occupation (≥15 ads with retrieved text), sized by ad count; vacancy-adoption is the share of its ads mentioning AI anywhere in the full ad text. Exposure predicts adoption only weakly — the bulk of the variation is left to user cost.

The slope is positive but the fit is loose (R² ≈ 0.33): exposure orders occupations only roughly. In our companion analysis, once capability is controlled the wage pull is the piece that survives out-of-sample testing, while a task-by-task user-cost split does not — Norway’s vacancies are too thin and too uniform in task mix to identify it yet. That is the case for tracking adoption over time and, ultimately, for worker-level data.

The weekly series (it grows from here)

Kode
dts = pd.to_datetime(wbody.date)
fig, ax = plt.subplots()
ax.plot(dts, wbody.share_body * 100, "o-", color=KOJA["amber"], lw=1.8, ms=7)
ax.set_ylabel("share of vacancies mentioning AI (%)"); ax.set_xlabel("snapshot date")
ax.set_title("AI demand in Norwegian vacancies, weekly (full ad text)")
ax.set_ylim(0, max(2.0, wbody.share_body.max() * 100 * 1.35))
plt.tight_layout(); plt.show()
Figur 3: Share of open Norwegian vacancies mentioning AI anywhere in the full ad text, by weekly snapshot. The series extends every week the collector runs.

Narrow vs. broad: what the full ad text adds

The full-text share reported throughout this page is the broad reading: an ad counts whenever AI is mentioned anywhere in the ad body — tools in use, “KI-nysgjerrig” wish-list items, AI-product employer branding. A much narrower reading counts an ad only when AI appears in its title or tag fields, i.e. the role is about AI. The gap between the two is itself informative — it is the difference between AI in the workplace and AI as the job, and the comparative-advantage story predicts the broad measure should move first as user cost falls.

Kode
wb = pd.read_csv(f"{D}/adoption_weekly_body.csv").sort_values("date")
fig, ax = plt.subplots()
dts = pd.to_datetime(wb.date)
ax.plot(dts, wb.share_any * 100,   "o-", color=KOJA["fjord"], lw=1.6, ms=7, label="either (any)")
ax.plot(dts, wb.share_body * 100,  "s-", color=KOJA["mist"],  lw=1.6, ms=6, label="broad: body mention")
ax.plot(dts, wb.share_title * 100, "o-", color=KOJA["amber"], lw=1.6, ms=7, label="narrow: title/tags")
ax.set_ylabel("share of vacancies (%)"); ax.set_xlabel("snapshot date")
ax.set_title("AI as the job vs AI in the workplace")
ax.set_ylim(0, max(2.0, wb.share_any.max() * 100 * 1.3)); ax.legend(frameon=False)
plt.tight_layout(); plt.show()
last = wb.iloc[-1]
Figur 4: Three readings of the same vacancies: AI in the title/tags (narrow — the role is about AI), AI anywhere in the ad body (broad — AI is mentioned at all), and either. Body shares are computed over ads whose full text could be retrieved.

In the latest snapshot (2026-08-13), 4.6% of ads with retrievable text mention AI somewhere in the body (460 of 10,000) — a factor of 4× the narrow title/tags reading. Most Norwegian employers who talk about AI are not hiring for AI; they are signalling that AI is part of how the workplace runs. The broad full-text series is the adoption measure this page reports; the narrow count isolates the small subset of jobs that are about AI.

Kode
ob = pd.read_csv(f"{D}/adoption_by_occupation_body.csv")
ob = ob[(ob.date == ob.date.max()) & (ob.n_matched >= 30)].nlargest(12, "share_body")
fig, ax = plt.subplots(figsize=(8, 4.6))
ax.barh(range(len(ob)), ob.share_body[::-1] * 100, color=KOJA["fjord"])
ax.set_yticks(range(len(ob)))
ax.set_yticklabels([s[:46] for s in ob.styrk[::-1]], fontsize=9)
ax.set_xlabel("share of ads mentioning AI in body (%)")
ax.set_title("Broad AI mentions by occupation")
plt.tight_layout(); plt.show()
Figur 5: Where the broad (body-mention) measure concentrates: occupations by share of ads mentioning AI anywhere in the text (latest snapshot, ≥30 ads with retrieved text).

What firms say: adoption rising, the user cost falling (SSB)

The vacancy signal is demand-side and thin. Statistics Norway’s own AI surveys give the complementary picture — and they say exactly what the comparative-advantage story predicts: use is rising while the cost of using AI is the thing holding it back, and that cost is falling. (Pulled reproducibly from SSB by adoption-tracker/’s rebuild — firm AI-use table 13265, barriers 13272, individual genAI use 14365.)

Kode
ssb = pd.read_csv("ssb-data/processed/ssb_ai_public_data_focus_extract.csv")
bar = ssb[ssb.table_id == 13272].copy()
yr = bar.Tid_code.max()
b = (bar[bar.Tid_code == yr].sort_values("value").tail(7))
fig, ax = plt.subplots()
ax.barh(range(len(b)), b.value, color=KOJA["fjord"])
ax.set_yticks(range(len(b)))
ax.set_yticklabels([s[:42] for s in b.ContentsCode_label], fontsize=9)
ax.set_xlabel(f"share of firms (%), {yr}")
ax.set_title("Barriers to AI use = the user cost")
for i, v in enumerate(b.value):
    ax.text(v, i, f" {v:.0f}", va="center", fontsize=8, color=KOJA["mist"])
plt.tight_layout(); plt.show()

cost = bar[bar.ContentsCode_label.str.contains("kostnad", case=False, na=False)].sort_values("Tid_code")
use = ssb[(ssb.table_id == 14365) & (ssb.ContentsCode_label.str.contains("Har brukt", na=False))].sort_values("Tid_code")
Figur 6: Why Norwegian firms hold back on AI (SSB table 13272, share of firms, latest year). These barriers are the ‘user cost’ r — and the cost barrier itself has fallen sharply since 2021.

Two trends make the point. The cost barrier (“Høge kostnader”) fell from 42% (2021) to 21% (2025) — using AI got cheaper and safer. Over the same window, individual generative-AI use rose from 36% to 54%. Falling user cost, rising adoption — the mechanism, in SSB’s own numbers.

Implications: a new occupation inside the chain

Look again at Figur 1. As tasks chain, the human does not simply disappear from the interior — they re-enter at the second-to-last task (review & edit) as the in-the-loop validator: the person who catches the chain’s errors before sign-off. That hybrid human-+-AI step is a plausible new occupation, and where it sits is a policy choice:

  • Lower the user cost and you move the validator earlier and deeper into the chain — the AI dividend is unlocked by training validators and building safe-to-use infrastructure, not by waiting for a smarter model.
  • It is also the natural entry point for younger workers if the new validation work grows faster than the old rungs disappear — the open empirical question behind Brynjolfsson, Chandar & Chen (2025).
Take this study into the AI Impact Analyst →

The analyst opens with every exhibit of this study loaded in the Exhibit picker — including the NAV vacancy-adoption sample, the weekly tracker series, and the SSB cost-barrier and genAI-use surveys, all deployed as datasets — and can edit each one on request: change the specification, the threshold, or the variables, and the revised figure or table appears directly in the chat.

References

  • Lindenlaub, I., Oh, R., Rodríguez, M. A. & Veldkamp, L. (2026). Beyond Exposure: Predicting AI Adoption Based on Comparative Advantage (“LORV”).
  • Demirer, M., Horton, J., Immorlica, N. & Lucier, B. (2026). Chaining Tasks: AI Automation and the Division of Labor.
  • Eloundou, T., Manning, S., Mishkin, P. & Rock, D. (2024). GPTs are GPTs: Labor Market Impact Potential of LLMs.
  • Brynjolfsson, E., Chandar, B. & Chen, R. (2025). Canaries in the Coal Mine: Early Labor-Market Effects of Generative AI. Stanford Digital Economy Lab.
  • Humlum, A. & Vestergaard, E. (2026). Still Waters, Rapid Currents: Early Labor-Market Transformation under Generative AI.
  • Statistics Norway (SSB), StatBank via PxWebApi v2 — tables 12542, 11418 (occupational employment & earnings) and 13265, 13271, 13272, 14365, 14364 (AI use, purposes, barriers, individual genAI use/non-use).

Hva siden måler

NoteSammendrag

«Særlig uavhengig stilling» etter arbeidsmiljøloven § 10-12 (2) tar en ansatt ut av arbeidstidskapittelet: ingen grenser for arbeidstid, ingen overtidsbetaling. Arbeidstilsynet er tydelig på at dette er en vurdering av de faktiske arbeidsoppgavene, ikke av tittelen eller yrkeskoden, og at de alminnelige reglene gjelder i tvilstilfeller. Derfor lar unntaket seg ikke lese av en STYRK-kode. Yrker-datasettet klassifiserer bare de 11 lederyrkene i STYRK-hovedgruppe 1 som særlig uavhengige og markerer resten som mulige falske negative.

Denne siden legger et empirisk signal oppå regelsettet. Hver uke leser proben de fullstendige annonsetekstene fra NAV og teller hvor mange stillinger som faktisk er markedsført med språk om særlig uavhengighet, unntak fra arbeidstidsbestemmelsene eller bortfall av overtidsbetaling. De sterke treffene som ligger utenfor lederyrkene er kandidater til manuell gjennomgang — stillinger som ser ut til å påberope seg unntaket uten å være ledelse.

Unntaket er rettslig viktig og samtidig vanskelig å observere. Det er nettopp derfor et tekstsignal er nyttig: det peker på hvor de uavklarte tilfellene faktisk dukker opp, slik at de kan vurderes — ikke som en juridisk konklusjon, men som en kandidatliste.

Hvordan signalet er bygget

Deteksjonen er gradert, kalibrert på rundt 6 700 reelle annonsetekster der den ordrette frasen forekommer i omtrent 0,01 %:

  • Sterkt — eksplisitt «særlig uavhengig», «§ 10-12», «unntatt fra arbeidstidsbestemmelsene», negert overtid («ingen/uten overtidsbetaling», «ikke overtidsbetalt») eller full råderett over egen arbeidstid. Dette er et reelt signal om unntak fra arbeidstidsreglene.
  • Svakt — «stor grad av selvstendighet/frihet», «høy grad av autonomi». En autonomiramme som støtter opp under, men ikke avgjør.
  • Ledende — «ledende stilling». Det beslektede, men separate lederunntaket etter § 10-12 (1), som telles for seg.

Tallgrunnlaget kommer fra den samme ukentlige NAV-innhentingen som adopsjonssporeren; proben gjenbruker tekst-cachen og henter ingenting ekstra.

#| label: setup
#| code-summary: "Last de ukentlige SU-panelene"
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator

def md(s):
    from IPython.display import Markdown
    return Markdown(s)

KOJA = {"fjord": "#5d79a0", "amber": "#cf9a5c", "mist": "#b1abb0",
        "muted": "#8292ad", "heading": "#e7ecf3", "rose": "#c07a86"}
plt.rcParams.update({
    "figure.facecolor": "none", "axes.facecolor": "none", "savefig.facecolor": "none",
    "savefig.transparent": True, "text.color": KOJA["mist"], "axes.labelcolor": KOJA["mist"],
    "axes.edgecolor": "#3a4860", "xtick.color": KOJA["muted"], "ytick.color": KOJA["muted"],
    "axes.titlecolor": KOJA["heading"], "axes.grid": True, "grid.color": "#8292ad",
    "grid.alpha": 0.15, "font.size": 11,
})

D = "adoption-tracker/data"
wk = pd.read_csv(f"{D}/su_weekly.csv").sort_values("date").reset_index(drop=True)
occ = pd.read_csv(f"{D}/su_by_occupation.csv")
cand = pd.read_csv(f"{D}/su_candidates.csv")
last = wk.iloc[-1]
last_date = str(last["date"])
#| output: asis
#| echo: false
n_strong = int(last["n_strong"]); n_led = int(last["n_ledende"])
n_bodies = int(last["n_bodies"]); n_weak = int(last["n_weak"])
cand_last = cand[cand.date == cand.date.max()]
n_nonlead = int((cand_last.role_class != "leadership").sum())
md(f"I siste øyeblikksbilde (**{last_date}**) bar **{n_strong}** av {n_bodies:,} leste annonser "
   f"et **sterkt** signal om særlig uavhengighet ({last['share_strong']*100:.2f} %), "
   f"{n_weak} et svakt autonomisignal ({last['share_weak']*100:.2f} %), og {n_led} omtalte en "
   f"**ledende** stilling. Av de sterke treffene ligger **{n_nonlead}** utenfor lederyrkene — "
   f"det er kandidatene til gjennomgang lenger ned.")

Utviklingen uke for uke

#| label: fig-su-trend
#| fig-cap: "Sterke og ledende treff (venstre akse, få per uke) mot svake autonomisignaler (høyre akse). Tallene er små: noen titalls per 10 000 annonser, og uke-til-uke-bevegelser bør leses som støy inntil serien er lengre."
fig, axL = plt.subplots(figsize=(7, 4.2))
x = wk["date"].astype(str)
axL.plot(x, wk["n_strong"], "-o", color=KOJA["amber"], label="Sterkt (SU/unntak)")
axL.plot(x, wk["n_ledende"], "-o", color=KOJA["fjord"], label="Ledende stilling")
axL.set_ylabel("Sterke / ledende treff (antall)")
axL.yaxis.set_major_locator(MaxNLocator(integer=True))
axL.set_ylim(bottom=0)

axR = axL.twinx()
axR.plot(x, wk["n_weak"], "--", color=KOJA["mist"], label="Svakt (autonomi)")
axR.set_ylabel("Svake autonomisignaler (antall)")
axR.grid(False)
axR.set_ylim(bottom=0)

lines = axL.get_lines() + axR.get_lines()
axL.legend(lines, [l.get_label() for l in lines], loc="upper left", frameon=False, fontsize=9)
axL.set_title("Særlig-uavhengig-signaler per ukentlig NAV-snapshot")
fig.autofmt_xdate(rotation=0, ha="center")
plt.tight_layout(); plt.show()

Hvilke yrker dukker opp?

#| label: fig-su-occ
#| fig-cap: "Yrker med minst ett sterkt SU-signal i siste uke, etter antall treff. Yrkestitlene er STYRK-08. Listen domineres ikke av lederyrkene alene — og det er hele poenget med proben."
o = occ[occ.date == occ.date.max()].copy()
o = o[o.styrk.astype(str).str.strip() != ""]
o = o.sort_values("n_strong").tail(14)
if len(o):
    fig, ax = plt.subplots(figsize=(7, max(2.4, 0.42*len(o))))
    ax.barh(o.styrk, o.n_strong, color=KOJA["amber"], alpha=0.85)
    ax.set_xlabel("Sterke SU-treff i siste uke (antall)")
    ax.xaxis.set_major_locator(MaxNLocator(integer=True))
    ax.set_title(f"Sterke SU-signaler etter yrke — {last_date}")
    ax.grid(axis="y", alpha=0)
    plt.tight_layout(); plt.show()
else:
    md("_Ingen yrkesfordeling for siste uke._")

Kandidatene til gjennomgang

Hver stilling med et sterkt signal som ikke er et lederyrke er en kandidat: en annonse markedsført som særlig uavhengig utenfor det regelbaserte settet, altså et mulig falskt negativt. Regelsettet (Yrker) regner bare ledelse som særlig uavhengig, så det er disse tilfellene som er verdt et menneskelig blikk.

#| output: asis
#| echo: false
c = cand[cand.date == cand.date.max()].copy()
c = c[c.role_class != "leadership"]
if len(c):
    rows = ["| Stilling | Yrke (STYRK-08) | Signal |", "|---|---|---|"]
    for _, r in c.iterrows():
        title = str(r["title"]).replace("|", "∣").strip()
        styrk = str(r["styrk"]).replace("|", "∣").strip() or "—"
        terms = str(r["signal_terms"]).replace("|", "∣").strip()
        rows.append(f"| {title} | {styrk} | {terms} |")
    out = f"**{len(c)} kandidat(er) i {last_date}:**\n\n" + "\n".join(rows)
else:
    out = f"_Ingen ikke-ledende kandidater i {last_date}._"
md(out)
AdvarselHva signalet ikke er

Et tekstsignal er ikke en rettslig avgjørelse. At en annonse omtaler særlig uavhengighet, unntak fra arbeidstidsbestemmelsene eller bortfall av overtid, betyr ikke at stillingen er unntatt — det avhenger av de faktiske oppgavene, og i tvil gjelder de alminnelige reglene. Negert overtid fanger dessuten både reelle § 10-12-tilfeller og ordinære fastlønnsformuleringer. Tallene er små, og listen er ment som et utgangspunkt for gjennomgang, ikke som en konklusjon.

Kilde og metode

  • Datakilde: ukentlig øyeblikksbilde av åpne stillinger på arbeidsplassen.nav.no, med fullstendig annonsetekst hentet for nye annonser.
  • Hjemmel: arbeidsmiljøloven § 10-12; Arbeidstilsynets veiledning om særlig uavhengig stilling.
  • Klassifisering: yrkene er STYRK-08; lederyrkene i hovedgruppe 1 utgjør det regelbaserte SU-settet.
  • Oppdatering: panelene su_weekly.csv, su_by_occupation.csv og su_candidates.csv bygges på nytt ved hver ukentlige kjøring av sporeren.