feat(ms-ai-architect): C2.3 onboarding skriver scheduled_detection cadence+enabled via gated CLI (TDD) [skip-docs]

K5 oppfylt: onboarding skriver scheduled_detection-blokka (enabled +
os_scheduler_cadence) til bruker-eid config; parseScheduleConfig leser den
tilbake til samme verdier (round-trip bevist deterministisk).

- serializeScheduleConfig(config) i detection-schedule.mjs — invers av
  parseScheduleConfig, rett ved parseren (én formatsannhet).
- write-schedule-config.mjs (NY, gated CLI, Claude-fri): merger på eksisterende
  config (override kun de to onboarding-eide nøklene; interval_days/
  include_skill_lifecycle overlever). backupFile + atomicWriteSync — ingen rå
  fs-write.
- backupFile(filePath, backupRoot) i lib/backup.mjs — presis enkeltfil-backup.
- onboard.md (orkestrator): «Planlagt deteksjon»-seksjon + scheduler i --status.
  onboarding-agent.md: note om at scheduler er orkestratorens jobb (ingen Bash).
- Avvik fra plan-tekst (dokumentert): scheduler-spørsmål i orkestrator, ikke agent.

Verifisert: detection-schedule 33/33 (+10) · backup-restore 15/15 (+3) ·
kb-update 213 · kb-eval 100 · validate 239/0/0 · test-hooks 11/11 ·
kb-integrity 192/192 · discovery 13/13 · gitleaks 3 pre-eksisterende.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-06-22 14:53:03 +02:00
commit afd75c4fed
8 changed files with 340 additions and 4 deletions

View file

@ -146,3 +146,16 @@ C2.1 er den bærende delsesjonen (etablerer lagring + resolver alle andre bygger
- **Kapp-tradeoff (bevisst):** fri kontekst kappes til `maxValueLen` (160) i det ambiente teaser-et — K3 krever bare «kappet til budsjett»-synlighet, og agentene leser full fil via fallback. Egen, mer raus fri-kontekst-cap er en triviell oppfølging hvis 160 viser seg for kort i praksis (ikke gjort — unngår knott uten påvist behov).
- **Verifisert:** user-data 25/25 (+9 fri-kontekst) · test-hooks 11/11 (+1: K3-ambient) · kb-update 200 · kb-eval 100 · validate PASSED (239/0/0) · kb-integrity 192/192 (220 baseline-warns) · discovery 13/13 · gitleaks 3 PRE-EKSISTERENDE (`playground/vendor/`).
- **Neste:** C2.3 (`os_scheduler_cadence` + `enabled` skrives av onboarding; round-trip mot `parseScheduleConfig`).
### C2.3 — RESULTAT (levert, TDD test FØR kode)
**Mål nådd:** onboarding skriver `scheduled_detection:`-blokka (`enabled` + `os_scheduler_cadence`) til den bruker-eide configen, og `parseScheduleConfig` leser den tilbake til samme verdier → **K5 oppfylt** (round-trip bevist deterministisk). Brukeren slipper å hånd-redigere den gitignored fila.
- **Deterministisk kjerne (K5):** ny **`serializeScheduleConfig(config)`** i `detection-schedule.mjs` — invers av `parseScheduleConfig`, lagt RETT VED parseren (én formatsannhet, ingen andre-parser). Skriver alle fire kjente nøkler normalisert slik `coerce()` leser dem, så `parseScheduleConfig(serializeScheduleConfig(c))` round-tripper (`daily`/`interval`/`enabled`/`interval_days`; garbage-kadens → `daily`).
- **Gated skrive-CLI:** ny **`scripts/kb-update/write-schedule-config.mjs`** (`--enabled` `--cadence` `[--home]`) — **MERGER** på eksisterende config (`parse → override KUN de to onboarding-eide nøklene → serialize`), så `interval_days`/`include_skill_lifecycle` satt andre steder overlever. Pure node, **Claude-fri** (kun ToS-rasjonale i kommentarer, ingen invokasjon); ikke en `DETECTION_STEP`. Skriver til `resolveConfigPath` (bruker-eid).
- **Gating-invariant (ufravikelig):** sikkerhetskopi via ny **`backupFile(filePath, backupRoot)`** i `lib/backup.mjs` (presis enkeltfil-backup — drar IKKE org/ inn i backup ved hver kadens-endring, slik `backupDir` ville) + **`atomicWriteSync`** (aldri rå fs-write). Backup er no-op ved første skriv (ingenting å bevare); backup tas før overskriving.
- **Designvalg som avvek fra plan-teksten (begrunnet):** scheduler-spørsmålet ligger i **orkestratoren (`onboard.md`)**, ikke i `onboarding-agent.md`. Agenten har kun `Write` (ingen Bash) og kan ikke kjøre den gatede CLI-en; orkestratoren har `Bash` + `AskUserQuestion`. Agenten fikk en note om at scheduler håndteres av orkestratoren etter intervjuet. (Speiler C2.2-mønsteret: dokumenter avviket, ikke følg plan-bokstaven når koden tilsier annet.)
- **`onboard.md`:** ny «Planlagt deteksjon»-seksjon (aktiver Ja/Nei opt-in → kadens daily/interval, daily anbefalt → gated CLI-kall + kort rapport); scheduler-rad i `--status`; «dekker»-liste utvidet med pkt. 7. **`onboarding-agent.md`:** note om at scheduler er orkestratorens jobb.
- **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).