ms-ai-architect/tests/test-onboarding-parity.sh
Kjell Tore Guttormsen d6a60ca480 feat(ms-ai-architect): Spor E krav 2 — onboarding Phase 6 guided-prose (coaching) (TDD) [skip-docs]
Phase 6 (fri kontekst) coacher nå brukeren FØR det åpne spørsmålet med to
lister: «hva som typisk hører hjemme» (initiativer, smertepunkter, tidligere
hendelser, strategiske føringer, leverandør-preferanser/-forbud) og «hva du
vanligvis kan hoppe over» (det de fem strukturerte kategoriene alt fanget;
generell AI-synsing; secrets/sensitive personopplysninger → ALDRI). Lagring
forblir ordrett. Lukker operatør-krav 2 (S39): onboarding skal coache på
inkludering/ekskludering, ikke bare stille ett blankt spørsmål.

TDD: 7 nye assert i tests/test-onboarding-parity.sh (RED→GREEN), suite-navn
utvidet til «K4-paritet + Phase 6 guided-prose». 21/21 PASS. validate 0-fail,
test-hooks 11/11, user-data node 25/25 — alle grønne.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 18:48:40 +02:00

85 lines
4.2 KiB
Bash
Executable file

#!/bin/bash
# test-onboarding-parity.sh — K4 (privat-sektor-paritet) regresjonsvakt for onboarding.
#
# Låser audit §5 punkt #1 (devils-advocate-audit-2026-06-18.md:167): en privat
# virksomhet skal kunne fullføre onboarding UTEN å velge «Annet» på sektor, med en
# relevant (privat) reguleringsliste, og uten å bli spurt rene offentlig-sektor-lover.
#
# Onboarding-intervjuet er interaktivt (AskUserQuestion) → ingen fixture-fangst som de
# andre output-testene. Vi asserterer derfor mot KILDEN (agents/onboarding-agent.md +
# commands/onboard.md): forgreningen og de private alternativene må være til stede.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
source "$SCRIPT_DIR/lib/e2e-helpers.sh"
PLUGIN_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Tillat override (rød-fase-diskrimineringsbevis kjører testen mot en strippet kopi).
AGENT="${ONBOARDING_AGENT_FILE:-$PLUGIN_ROOT/agents/onboarding-agent.md}"
ORCH="${ONBOARDING_ORCH_FILE:-$PLUGIN_ROOT/commands/onboard.md}"
if [ ! -f "$AGENT" ]; then
echo "ERROR: Onboarding agent not found: $AGENT"
exit 1
fi
init_suite "Onboarding-agent kildesjekk (K4-paritet + Phase 6 guided-prose)"
# === Forgrening: sektortype velges først og styrer oppfølgingen ===
assert_matches_pattern "$AGENT" "Sektortype.*Offentlig sektor, Privat sektor" \
"Sektortype forgrener offentlig/privat på toppnivå"
assert_matches_pattern "$AGENT" "forgren intervjuet" \
"Eksplisitt instruks om å forgrene intervjuet på sektortype"
# === K4 kjerne: privat virksomhet trenger IKKE velge «Annet» på sektor ===
# Den private sektor-greinen må liste navngitte private sektorer.
assert_matches_pattern "$AGENT" "Hvis Privat sektor.*Finans/bank/forsikring" \
"Privat sektor-grein lister Finans/bank/forsikring (bank slipper «Annet»)"
for sektor in "Industri/produksjon" "Handel" "Energi" "Telekom"; do
assert_matches_pattern "$AGENT" "Hvis Privat sektor.*${sektor}" \
"Privat sektor-grein lister ${sektor}"
done
# === K4 kjerne: relevant privat reguleringsliste ===
for reg in "DORA" "Finansforetaksloven" "Finanstilsynets IKT-forskrift" \
"Verdipapirhandelloven" "Hvitvaskingsloven"; do
assert_matches_pattern "$AGENT" "$reg" \
"Privat reg-sett inneholder ${reg}"
done
# === Forgrening verner private mot rene offentlig-sektor-lover ===
assert_matches_pattern "$AGENT" "ALDRI private virksomheter om Offentleglova" \
"Private spørres ALDRI Offentleglova/Arkivloven/Forvaltningsloven"
# === Spor E krav 2: Phase 6 guided-prose (coaching) ===
# Operatør-direktiv S39 (memory: onboarding-quality-bar): fri-kontekst-fasen skal
# ikke bare stille ÉtT blankt spørsmål — den skal COACHE brukeren på hva som typisk
# hører hjemme og hva som trygt kan hoppes over, så fri-konteksten faktisk gjør
# rådene mer treffsikre (multiplikator-effekten). Vi asserterer mot agent-kilden.
assert_matches_pattern "$AGENT" "coache? brukeren" \
"Phase 6 instruerer agenten om å coache brukeren (ikke bare stille blankt spørsmål)"
assert_matches_pattern "$AGENT" "[Pp]resenter de to listene" \
"Phase 6 ber agenten presentere coaching-listene for brukeren"
assert_matches_pattern "$AGENT" "typisk hører hjemme" \
"Phase 6 lister hva som typisk bør med (inkluderings-coaching)"
assert_matches_pattern "$AGENT" "vanligvis kan hoppe over" \
"Phase 6 lister hva som vanligvis kan hoppes over (ekskluderings-coaching)"
assert_matches_pattern "$AGENT" "allerede.*fanget i de fem strukturerte kategori" \
"Phase 6 ber bruker ikke gjenta det de fem strukturerte kategoriene alt fanget"
assert_matches_pattern "$AGENT" "(secrets|sensitive personopplysninger).*ALDRI" \
"Phase 6 advarer mot å lime inn secrets/sensitive personopplysninger"
# Regresjon: fri-konteksten lagres fortsatt ordrett (ikke omskrevet/forkortet)
assert_matches_pattern "$AGENT" "ordrett" \
"Phase 6 lagrer fortsatt brukerens prosa ordrett (regresjonsvakt)"
# === Orkestratoren er sektor-nøytral (delegerer, hardkoder ikke offentlig) ===
if [ -f "$ORCH" ]; then
if grep -qE "Onboarding-agenten styrer selve intervjuet" "$ORCH"; then
pass "Orkestrator delegerer intervjuet til agenten (sektor-nøytral)"
else
warn "Orkestrator: fant ikke delegerings-note (sjekk onboard.md)"
fi
fi
print_summary