test(ms-ai-architect): C2.4 lås K4 privat-sektor-paritet (regresjonsvakt) + omdøp feildøpt doc [skip-docs]

C2 KOMPLETT (C2.1->C2.4). C2.4 var verifikasjon, ikke nybygg: privat-greinen
i onboarding kom i 6e1fc6d (FOER C2.1), saa audit §167-onboarding-residu var
allerede lukket i kode. Denne oekta beviser + laaser det.

- tests/test-onboarding-parity.sh (NY): 14 asserts mot KILDEN
  (onboarding-agent.md Phase 1; onboarding er interaktivt AskUserQuestion ->
  ingen output-fixture). Dekker sektortype-forgrening, privat sektor-grein
  (bank slipper «Annet»), privat reg-sett (DORA/Finansforetaksloven/
  Finanstilsynets IKT-forskrift/Verdipapirhandelloven/Hvitvaskingsloven), og
  at private aldri spoerres Offentleglova/Arkivloven. TDD roed->groenn:
  strippet offentlig-only-kopi -> 13/14 FAIL; ekte fil -> 14/14 PASS.
- tests/run-e2e.sh: wiret --onboarding (med i --all).
- §167 (d) bevisst IKKE bygget: «egen dataklassifiserings-taksonomi for privat
  Fase 3» er gull-plating utenfor K4 (dagens taksonomi er alminnelig norsk
  bedrifts-klassifisering; privat fullfoerer Fase 3 uhindret).
- Omdoept feildoept docs/onboarding-ros-analysis.md ->
  docs/windows-clone-to-pr-ros-guide.md (Windows clone-to-PR-bidragsyterguide,
  ikke onboarding-analyse); plan+brief-ref oppdatert.

Verifisert: onboarding-parity 14/14 (NY) · validate 239/0/0 · e2e alle suiter ·
discovery 13/13 · test-hooks 11/11 · kb-integrity 192/192 (220 baseline-warns) ·
gitleaks 3 PRE-EKSISTERENDE (playground/vendor/).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-06-22 17:39:11 +02:00
commit c4d434f9e9
5 changed files with 88 additions and 4 deletions

View file

@ -23,7 +23,7 @@ Virksomhetskontekst (sektor, lisens, dataklassifisering, budsjett, styringsmodel
**Tilstøtende (allerede dokumentert):** `docs/devils-advocate-audit-2026-06-18.md` §167 — onboarding kan ikke representere en privat virksomhet (sektor-valg hardkodet offentlig; reguleringsliste mangler DORA/Finansforetaksloven m.m.). Bør løses i samme redesign siden det treffer samme filer.
> Merknad: `docs/onboarding-ros-analysis.md` er feildøpt — den er en Windows «clone-to-PR»-guide for ROS-featuren, **ikke** en onboarding-analyse. Vurder å døpe den om i redesignet.
> Merknad: `docs/onboarding-ros-analysis.md` var feildøpt — den er en Windows «clone-to-PR»-guide for ROS-featuren, **ikke** en onboarding-analyse. **Omdøpt i C2.4** til `docs/windows-clone-to-pr-ros-guide.md`.
## Skisserte løsningsretninger (ikke bindende — design godkjennes senere)

View file

@ -102,7 +102,7 @@ C2.1 er den bærende delsesjonen (etablerer lagring + resolver alle andre bygger
- **Ikke** del av KB-mekanisme-redesignet (`kb-mechanism-redesign-plan.md`) eller Spor B (`skill-lifecycle-spor-b-plan.md`). Eget spor, egen plan.
- C3 (kurs/training, #25) tas **etter** C2.
- `docs/onboarding-ros-analysis.md` er feildøpt (Windows clone-to-PR-guide, ikke onboarding-analyse) — vurder omdøping i C2.4 (lav prioritet).
- `docs/onboarding-ros-analysis.md` var feildøpt (Windows clone-to-PR-guide, ikke onboarding-analyse) — **omdøpt i C2.4** til `docs/windows-clone-to-pr-ros-guide.md`.
---
@ -159,3 +159,16 @@ C2.1 er den bærende delsesjonen (etablerer lagring + resolver alle andre bygger
- **Kjent begrensning (pre-eksisterende, ikke C2.3-introdusert):** CLI-kallet i `onboard.md` bruker relativ `node scripts/...`-sti (antar cwd = plugin-rot), identisk konvensjon som `kb-update.md`. Org-/config-stiene er home-baserte (robuste).
- **Verifisert:** detection-schedule 33/33 (+10: serialize round-trip + writeScheduleConfig merge/backup/end-to-end) · backup-restore 15/15 (+3: `backupFile`) · kb-update 213 · kb-eval 100 · validate PASSED (239/0/0) · test-hooks 11/11 · kb-integrity 192/192 (220 baseline-warns) · discovery 13/13 · gitleaks 3 PRE-EKSISTERENDE (`playground/vendor/`).
- **Neste:** C2.4 (verifiser privat-sektor-paritet #4 + lukk evt. §167-residu).
### C2.4 — RESULTAT (verifikasjon + regresjonsvakt, TDD rød→grønn)
**Mål nådd:** **K4 verifisert oppfylt** og låst mot regresjon → privat-sektor-paritet i onboarding er bevist, ikke antatt.
- **Funn (kildehistorikk):** privat-greinen ble innført i commit **`6e1fc6d`** («#7d privat-sektor-paritet … onboarding-forgrening … audit §5»), FØR C2.1C2.3. §167-onboarding-residuet (audit §5 punkt #1) var altså **allerede lukket i kode**. C2.4 var dermed ekte **verifikasjon**, ikke nybygg — som planraden forutså.
- **K4 bekreftet mot kilden** (`agents/onboarding-agent.md` Phase 1): sektortype forgrener offentlig/privat; privat sektor-grein lister Finans/bank/forsikring, Industri/produksjon, Handel, Energi, Telekom (**bank slipper «Annet»**); privat reg-sett har DORA, Finansforetaksloven, Finanstilsynets IKT-forskrift, Verdipapirhandelloven, Hvitvaskingsloven; private spørres ALDRI Offentleglova/Arkivloven/Forvaltningsloven. Orkestratoren (`commands/onboard.md`) er sektor-nøytral (delegerer intervjuet).
- **Ny regresjonsvakt:** `tests/test-onboarding-parity.sh` (14 asserts mot kilden, ikke fixture — onboarding er interaktivt `AskUserQuestion`, ingen output-fixture). Bruker `lib/e2e-helpers.sh`-mønsteret som de andre output-testene. Wiret inn i `tests/run-e2e.sh` (`--onboarding`, med i `--all`). **TDD-diskriminering bevist:** testen kjørt mot en strippet offentlig-only-kopi → 13/14 FAIL (rød); mot ekte fil → 14/14 PASS (grønn).
- **§167-residu (d) bevisst IKKE bygget (begrunnet):** anbefalingens «betinget Fase 3-gren med egen dataklassifiserings-taksonomi for regulert privat sektor» er gull-plating UTENFOR K4. Dagens Fase 3-taksonomi (Åpen/Intern/Fortrolig/Strengt fortrolig) er en alminnelig norsk *bedrifts*-klassifisering — en privat virksomhet fullfører Fase 3 uten hindring; kun «Hemmelig (sikkerhetsloven)» er offentlig-spesifikk og velges simpelthen ikke. K4 krever ikke egen taksonomi. Ingen knott uten påvist behov (speiler C2.2-/C2.3-disiplinen).
- **Medrydd (plan §Avgrensning):** feildøpte `docs/onboarding-ros-analysis.md` (en Windows clone-to-PR-bidragsyterguide, ikke onboarding-analyse) **omdøpt**`docs/windows-clone-to-pr-ros-guide.md` (`git mv`); plan- + brief-referanser oppdatert. Fjerner reell forvekslingsfelle (utvikler- vs. virksomhets-onboarding).
- **Avgrensning (bekreftet):** audit §5 punktene #2#6 (sektor-parametrisering i classify/dpia/ros/frimpact/utredning/review, README/help/playground privat-bane) er IKKE C2.4-scope. Mange ble adressert i `6e1fc6d`; gjenstående er eget arbeid utenfor C2 (onboarding-paritet). Ikke eskalert uten godkjenning.
- **Verifisert:** onboarding-parity 14/14 (NY) · validate PASSED (239/0/0) · e2e alle suiter grønne · discovery 13/13 · test-hooks 11/11 · kb-integrity 192/192 (220 baseline-warns) · gitleaks 3 PRE-EKSISTERENDE (`playground/vendor/`).
- **C2 KOMPLETT** (C2.1→C2.4 ✅). **Neste:** C3 (kurs/training, #25) — eller release-beslutning (v1.16.0) i push-vindu.

View file

@ -1,6 +1,6 @@
#!/bin/bash
# run-e2e.sh — Run E2E regression tests for agent outputs
# Usage: bash tests/run-e2e.sh [--security] [--cost] [--summary] [--ros] [--ai-act] [--playground] [--kb-update] [--all]
# Usage: bash tests/run-e2e.sh [--security] [--cost] [--summary] [--ros] [--ai-act] [--playground] [--kb-update] [--onboarding] [--all]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@ -18,6 +18,7 @@ RUN_ROS=false
RUN_AI_ACT=false
RUN_PLAYGROUND=false
RUN_KB_UPDATE=false
RUN_ONBOARDING=false
if [ $# -eq 0 ] || [ "${1:-}" = "--all" ]; then
RUN_SECURITY=true
@ -27,6 +28,7 @@ if [ $# -eq 0 ] || [ "${1:-}" = "--all" ]; then
RUN_AI_ACT=true
RUN_PLAYGROUND=true
RUN_KB_UPDATE=true
RUN_ONBOARDING=true
else
while [ $# -gt 0 ]; do
case "$1" in
@ -37,8 +39,9 @@ else
--ai-act) RUN_AI_ACT=true ;;
--playground) RUN_PLAYGROUND=true ;;
--kb-update) RUN_KB_UPDATE=true ;;
--onboarding) RUN_ONBOARDING=true ;;
*)
echo "Usage: bash tests/run-e2e.sh [--security] [--cost] [--summary] [--ros] [--ai-act] [--playground] [--kb-update] [--all]"
echo "Usage: bash tests/run-e2e.sh [--security] [--cost] [--summary] [--ros] [--ai-act] [--playground] [--kb-update] [--onboarding] [--all]"
exit 1
;;
esac
@ -73,6 +76,10 @@ if $RUN_AI_ACT; then
bash "$SCRIPT_DIR/test-ai-act-output.sh" || FAILURES=$((FAILURES + 1))
fi
if $RUN_ONBOARDING; then
bash "$SCRIPT_DIR/test-onboarding-parity.sh" || FAILURES=$((FAILURES + 1))
fi
if $RUN_PLAYGROUND; then
bash "$SCRIPT_DIR/test-playground-v3.sh" || FAILURES=$((FAILURES + 1))
bash "$SCRIPT_DIR/test-playground-parsers.sh" || FAILURES=$((FAILURES + 1))

64
tests/test-onboarding-parity.sh Executable file
View file

@ -0,0 +1,64 @@
#!/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 Privat-sektor-paritet (K4)"
# === 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"
# === 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