// ── Autonomie-roadmap als data (voedt het voortgangsdashboard) ───────────────
// Gestructureerde spiegel van AUTONOMIE-ROADMAP.md (§3 capaciteitslagen en
// §5 werven per Claude-model). Dit bestand bevat uitsluitend de HAND-
// onderhouden stand van de werven en lagen; alles wat meetbaar is (uitbouw-
// dekking, extractor-gaten, aangesloten connectoren, bibliotheektellingen)
// berekent app/voortgang/page.tsx live uit de echte registers.
//
// Werk je een werf af of start je er één? Pas dan AUTONOMIE-ROADMAP.md én dit
// bestand in dezelfde commit aan — het dashboard toont wat hier staat.

export type WerfModel = "opus" | "sonnet" | "fable";
export type WerfStatus = "gedaan" | "loopt" | "te-doen";

export interface AutWerf {
  id: string;
  model: WerfModel;
  titel: string;
  /** Capaciteitslagen (0-8) waar de werf op werkt. */
  lagen: number[];
  status: WerfStatus;
  /** Wat er ná de oplevering nog open blijft (het "Resterend" uit de roadmap). */
  resterend?: string;
}

export const AUT_WERVEN: AutWerf[] = [
  // Opus 4.8 — de dragende ontwerpkeuzes (allemaal opgeleverd).
  { id: "AUT-O1", model: "opus", titel: "Zekerheids- & escalatiemodel", lagen: [7], status: "gedaan", resterend: "Echte tier-3-handelingen aansluiten + kantoorbeleid persistent maken." },
  { id: "AUT-O2", model: "opus", titel: "Verantwoordings-/audit-model", lagen: [0], status: "gedaan", resterend: "Persistente opslag + effectief loggen bij elke tier-3-handeling." },
  { id: "AUT-O3", model: "opus", titel: "Perceptielaag-contract", lagen: [1], status: "gedaan", resterend: "Het extractorregister vullen (AUT-S1)." },
  { id: "AUT-O4", model: "opus", titel: "Levenscyclus-toestandsmachine", lagen: [2], status: "gedaan", resterend: "De motor die de fase voortstuwt (AUT-S3)." },
  { id: "AUT-O5", model: "opus", titel: "Connector-architectuur", lagen: [3, 5], status: "gedaan", resterend: "Echte adapters per dienst (AUT-S4/S7)." },
  { id: "AUT-O6", model: "opus", titel: "AML/KYC-risicomodel", lagen: [3], status: "gedaan", resterend: "De flow die kenmerken verzamelt en de notaris laat beslissen (AUT-S5)." },
  { id: "AUT-O7", model: "opus", titel: "Financiële-integriteitsmodel", lagen: [6], status: "gedaan", resterend: "Afrekening/derdengelden-flow + bankconnector (AUT-S8)." },
  // Sonnet 5 — de opbouw per laag (ná het bijhorende Opus-ontwerp).
  { id: "AUT-S1", model: "sonnet", titel: "Intake-extractors per brondocument", lagen: [1], status: "te-doen" },
  { id: "AUT-S2", model: "sonnet", titel: "Tegenstrijdigheden- & volledigheidsrapport", lagen: [1, 2], status: "te-doen" },
  { id: "AUT-S3", model: "sonnet", titel: "Levenscyclus-motor implementeren", lagen: [2], status: "te-doen" },
  { id: "AUT-S4", model: "sonnet", titel: "Opzoekingen-connectoren (mock-eerst)", lagen: [3], status: "te-doen" },
  { id: "AUT-S5", model: "sonnet", titel: "AML/KYC-flow implementeren", lagen: [3], status: "te-doen" },
  { id: "AUT-S6", model: "sonnet", titel: "Generatie-dekking uitbreiden (gouden paden)", lagen: [4], status: "loopt" },
  { id: "AUT-S7", model: "sonnet", titel: "Formaliteiten-connectoren", lagen: [5], status: "te-doen" },
  { id: "AUT-S8", model: "sonnet", titel: "Afrekening & derdengelden implementeren", lagen: [6], status: "te-doen" },
  // Fable 5 — het mechanische fundament (allemaal opgeleverd).
  { id: "AUT-F1", model: "fable", titel: "Ratchet-tests per nieuwe laag", lagen: [1, 3, 5], status: "gedaan" },
  { id: "AUT-F2", model: "fable", titel: "Schema-/typevelden & guards", lagen: [0, 1, 2, 7], status: "gedaan" },
  { id: "AUT-F3", model: "fable", titel: "Mock-fixtures voor de connectoren", lagen: [3, 5], status: "gedaan" },
  { id: "AUT-F4", model: "fable", titel: "Codegen & registers", lagen: [1, 3, 5], status: "gedaan" },
  { id: "AUT-F5", model: "fable", titel: "Observability-uitbreiding", lagen: [1, 3], status: "gedaan" },
];

export type LaagStatus =
  /** De laag werkt vandaag al productief (het rijpste stuk van de keten). */
  | "operationeel"
  /** Het dragende ontwerp + de bewaakte kern staan; de opbouw (AUT-S) volgt. */
  | "kern-bewaakt"
  /** Bij wet aan de notaris voorbehouden — wordt nooit geautomatiseerd. */
  | "voorbehouden";

export interface AutonomieLaag {
  laag: number;
  titel: string;
  omschrijving: string;
  status: LaagStatus;
  /** De bewaakte kernmodule(s) van de laag, als leesbare verwijzing. */
  kern?: string;
  volgendeStap?: string;
}

export const AUTONOMIE_LAGEN: AutonomieLaag[] = [
  {
    laag: 0,
    titel: "Governance & grenzen",
    omschrijving: "Drie handelingsregimes, GDPR-scheiding, ambtelijk voorbehoud en de append-only audit-hashketen.",
    status: "kern-bewaakt",
    kern: "lib/dossier/audit.ts",
    volgendeStap: "Persistente opslag van de audit-ketting en effectief loggen bij elke tier-3-handeling.",
  },
  {
    laag: 1,
    titel: "Perceptie / intake",
    omschrijving: "Bronstukken zelf lezen: per brondocumenttype een extractor naar het DossierIntake-contract.",
    status: "kern-bewaakt",
    kern: "lib/dossier/perceptie.ts",
    volgendeStap: "AUT-S1: één extractor per documentair brontype (de ratchet-gatenlijst is de werklijst).",
  },
  {
    laag: 2,
    titel: "Dossierregie",
    omschrijving: "De negen dossierfasen als bewaakte toestandsmachine, met termijnbewaking over de hele levenscyclus.",
    status: "kern-bewaakt",
    kern: "lib/dossier/levenscyclus.ts",
    volgendeStap: "AUT-S3: de motor die de fase voortstuwt en de volgende stap bepaalt.",
  },
  {
    laag: 3,
    titel: "Compliance & opzoeking",
    omschrijving: "AML/KYC-risicomodel plus de connector-laag voor externe opzoekingen (mock-eerst, tier-3-poort verplicht).",
    status: "kern-bewaakt",
    kern: "lib/dossier/aml.ts · lib/connectoren/connector.ts",
    volgendeStap: "AUT-S4/S5: echte opzoekings-adapters en de AML-flow met escalatie naar de notaris.",
  },
  {
    laag: 4,
    titel: "Generatie & berekening",
    omschrijving: "De bestaande motor: ontwerpakte (NL/FR), modelmails en afrekening als werkdocument voor de notaris.",
    status: "operationeel",
    kern: "lib/dossier/werkdossier.ts",
    volgendeStap: "AUT-S6: nieuwe aktetypes en sub-paden volgens het draaiboek (zie de module Gouden paden).",
  },
  {
    laag: 5,
    titel: "Uitvoering & formaliteiten",
    omschrijving: "Registratie, hypothecaire overschrijving, notariële databanken en aangiften — via dezelfde connector-laag.",
    status: "kern-bewaakt",
    kern: "lib/connectoren/fixtures/",
    volgendeStap: "AUT-S7: per formaliteit een adapter, tier-3-geregeld, mock-eerst.",
  },
  {
    laag: 6,
    titel: "Financiële afhandeling",
    omschrijving: "Derdengelden met harde waarborgen: saldo nooit negatief, doorstorten nooit autonoom.",
    status: "kern-bewaakt",
    kern: "lib/dossier/derdengelden.ts",
    volgendeStap: "AUT-S8: de afrekening/derdengelden-flow + de module Boekhouding (nu gereserveerd).",
  },
  {
    laag: 7,
    titel: "Autonomie-besturing",
    omschrijving: "Het brein: zekerheid afgeleid uit controleerbare gronden, default-deny voor tier 3, escalatie met reden.",
    status: "kern-bewaakt",
    kern: "lib/dossier/autonomie.ts",
    volgendeStap: "Echte tier-3-handelingen door beslisEscalatie sturen en het kantoorbeleid persistent maken.",
  },
  {
    laag: 8,
    titel: "Ambtelijk sluitstuk",
    omschrijving: "Verlijden, wils- en identiteitscontrole, voorlezing en rechtsweigering: bij wet aan de notaris.",
    status: "voorbehouden",
  },
];

/** De AUT-werven die op een laag werken (voor de werf-chips per laag). */
export function wervenVoorLaag(laag: number): AutWerf[] {
  return AUT_WERVEN.filter((w) => w.lagen.includes(laag));
}

/**
 * Snapshot van de noordster-plafonds (uniek aantal open [AAN TE VULLEN]-velden
 * per scenario, lager = beter). Bron van waarheid blijft de ratchet-test
 * lib/dossier/noordster-metriek.test.ts — verlaag je daar een plafond, neem de
 * nieuwe stand dan hier mee over.
 */
export const NOORDSTER_PLAFONDS: { scenario: string; plafond: number }[] = [
  { scenario: "Woning Vlaanderen (NL)", plafond: 60 },
  { scenario: "Woning Brussel (NL)", plafond: 48 },
  { scenario: "Woning Wallonië (NL)", plafond: 39 },
  { scenario: "Woning Vlaanderen (FR)", plafond: 65 },
  { scenario: "Appartement Vlaanderen (NL)", plafond: 79 },
];

/**
 * Snapshot van het agentwenken-ratchet-plafond (onderdelen met > 2 varianten
 * zonder agentwenken; enkel dalen). Bron van waarheid:
 * data/modeldocumenten/agentwenken-ratchet.test.ts. De wérkelijke teller
 * berekent het dashboard live uit seedOnderdelen.
 */
export const AGENTWENKEN_PLAFOND = 116;

/** Brontypes zonder in te lezen document — spiegel van lib/fundament-ratchet.test.ts. */
export const NIET_DOCUMENTAIRE_BRONTYPES: readonly string[] = ["verklaring-partij", "manueel"];
