#!/usr/bin/env python3
"""Build rapport_v1.0.docx — Repair Clan eindrapport.
python-docx conform MASTER_SOP §1.8, JvG-branding conform MASTER_STYLEGUIDE v1.5."""

import os
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH

LOGO = "/root/projects/jg/assets/branding/jvg-consultancy-logo.png"
OUT = "/root/projects/jg/2026-repair-clan-uniform-deliverables/deliverables/rapport_v1.0.docx"
PRIMAIR = RGBColor(0x00, 0x33, 0x66)
AMBER = RGBColor(0xB4, 0x7A, 0x00)
ROOD = RGBColor(0xC0, 0x39, 0x2B)
GROEN = RGBColor(0x00, 0x70, 0x3C)

doc = Document()
st = doc.styles["Normal"]
st.font.name = "Segoe UI"
st.font.size = Pt(10.5)
for sec in doc.sections:
    sec.top_margin, sec.bottom_margin = Cm(2), Cm(2)
    sec.left_margin, sec.right_margin = Cm(2.2), Cm(2.2)

def h1(t):
    p = doc.add_heading(t, 1)
    for r in p.runs:
        r.font.color.rgb = PRIMAIR; r.font.name = "Segoe UI"
    return p

def h2(t):
    p = doc.add_heading(t, 2)
    for r in p.runs:
        r.font.color.rgb = PRIMAIR; r.font.name = "Segoe UI"
    return p

def para(t, bold=False, kleur=None, size=None):
    p = doc.add_paragraph()
    r = p.add_run(t)
    r.bold = bold
    if kleur: r.font.color.rgb = kleur
    if size: r.font.size = Pt(size)
    return p

def tabel(headers, rows):
    t = doc.add_table(rows=1, cols=len(headers))
    t.style = "Light Grid Accent 1"
    for i, htxt in enumerate(headers):
        c = t.rows[0].cells[i]
        c.text = htxt
        for r in c.paragraphs[0].runs: r.bold = True
    for row in rows:
        cells = t.add_row().cells
        for i, v in enumerate(row):
            cells[i].text = str(v)
    return t

# ---------- COVER ----------
if os.path.isfile(LOGO):
    lp = doc.add_paragraph(); lp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    lp.add_run().add_picture(LOGO, width=Cm(9))
doc.add_paragraph()
h1("Uniforme Deliverables Borging")
para("Foutanalyse en automatische kwaliteitsborging naar aanleiding van drie productiefouten op 24 augustus 2026", size=13, kleur=PRIMAIR)
doc.add_paragraph()
para("Project: 2026-repair-clan-uniform-deliverables", bold=True)
para("Opdrachtgever: Kas (Director of Operations) — Repair Clan-opdracht")
para("Datum: 24 augustus 2026, avond")
para("Versie: 1.0 (eerste oplevering)")
para("Classificatie: Intern — Procesverbetering", bold=True)
para("SOP-referentie: MASTER_SOP v8.8 · MASTER_STYLEGUIDE v1.5")
doc.add_page_break()

# ---------- 1 ----------
h1("1. Managementsamenvatting")
para("Op de avond van 24 augustus 2026 deden zich in het Chromium VI-auditproject (2026-audit-koole-chromium-vi) drie opeenvolgende productiefouten voor: (1) de hseq_specialist werd om 20:07 UTC gestart zonder de verplichte Fase 0-1-initialisatie, (2) de qa_engineer draaide om 21:03 UTC twaalf tool calls zonder een fysiek rapport op te leveren — waarna de Director het QC-werk zelf overnam, hetgeen bovendien de anti-corruptieregel (§5.4) schendt — en (3) de eerste deliverables werden gecombineerd opgeleverd in plaats van gescheiden, conform de Mercury Golden Standard.")
para("Dit rapport analyseert de drie fouten forensisch (met fysiek bewijs), stelt twaalf lacunes in MASTER_SOP v8.8 vast en levert één nieuw instrument: de Deliverables Gatekeeper — een script dat de uniformiteit van deliverables en de SOP-fasen mechanisch afdwingt op drie momenten in de pipeline. Het instrument is gebouwd en gevalideerd: het reproduceert alle drie de fouten van vanavond als automatische detectie.", bold=True)
para("Belangrijkste bevinding: alle SOP-kwaliteitsregels liggen ná de productie — er bestaat geen enkele mechanische gate vóór of tijdens productie. Compliance hing volledig af van orchestrator-discipline op het moment van deadline-druk. De gatekeeper sluit precies dat gat.", kleur=ROOD, bold=True)
tabel(["Misser", "Moment (UTC)", "Root cause", "Gatekeeper-detectie"],
      [["SOP-skip bij start", "20:07", "Geen Phase-Entry Gate tussen planning en executie", "entry: FAIL (submappen, sources.md, prompt-log)"],
       ["QC zonder fysiek bestand", "21:03", "Geen output-contract + Director-noodoplossing (VOID)", "artefact: FAIL + anti-corruptiescan: FAIL"],
       ["Gecombineerde deliverables", "20:41-21:13", "Golden Standard niet gecodificeerd als manifest", "deliverables: FAIL (verboden patronen, changelog)"]])

# ---------- 2 ----------
h1("2. Aanleiding en opdracht")
para("De Director identificeerde na afloop van de Chromium VI-levering drie missers en gaf de Repair Clan-opdracht: herstel de schade, analyseer de fouten diepgaand en implementeer automatische borging zodat uniforme deliverables voortaan door tooling worden afgedwongen in plaats van door menselijke discipline. Deadline: morgenochtend. De fysieke contextcheck bevestigde de Mercury Golden Standard-structuur en de gecorrigeerde maar nog met legacy-restanten belaste Chromium VI-structuur.")

# ---------- 3 ----------
h1("3. Foutanalyse (samenvatting)")
h2("3.1 Misser 1 — SOP-skip (20:07 UTC)")
para("De hseq_specialist werd direct gespawnd zonder Fase 0-1. Fysiek bewijs: project_prompts.log is gedateerd 20:38:16 UTC — 31 minuten ná de start van de specialist — en de projectstructuur is grotendeels pas na 20:38 opgebouwd. Bronverzameling in research/ liep tot 21:23 achter de feiten aan. De prompt-log als 'Legal Source' (§1.13) bestond dus niet tijdens de uitvoering; het GO-moment is nergens vastgelegd.")
para("Root cause (5-why): de SOP is advisory vóór Fase 2 — er is geen mechanische Phase-Entry Gate die een spawn blokkeert zonder geïnitialiseerde projectmap.", bold=True)
h2("3.2 Misser 2 — qa_engineer zonder fysiek bestand (21:03 UTC)")
para("De qa_engineer voerde 12 tool calls uit zonder fysiek QC-rapport. Kas loste dit op met een nood-QC (working/qa_report.md) — maar dat schendt §5.4 ANTI-CORRUPTIE REGEL: een audit door de Director is per definitie VOID. Het nood-rapport bevat bovendien acht van twintig checklist-items als 'Onbekend' (DOCX-inspectie niet uitgevoerd), terwijl de conclusie 'GO' luidt — een intern tegenstrijdig rapport op een P1-kritiek compliance-document.")
para("Root cause: twee lacunes — QC-taken definiëren fysieke output niet als harde eis, en er is geen gecodeerd herstelrecept voor 'run zonder artefact' dat de Director weghoudt bij de verboden zelfreparatie.", bold=True)
h2("3.3 Misser 3 — Gecombineerde deliverables (20:41-21:13 UTC)")
para("De eerste oplevering bevatte één gecombineerd DOCX/HTML-paar (audit + herzieningsvoorstel) plus één gecombineerd checklists-DOCX, in plaats van gescheiden bestanden conform Mercury. Na correctie resteren drie legacy-combined bestanden in de deliverables-map en een CHANGELOG die nog de oude structuur beschrijft — vijf gescheiden bestanden worden erin niet genoemd.")
para("Root cause: de Golden Standard-structuur bestaat alleen als impliciete kennis ('zoals het vorige project'), niet als machine-leesbaar contract waartegen vóór productie wordt gediffd.", bold=True)

# ---------- 4 ----------
h1("4. MASTER_SOP v8.8 — gap-analyse (samenvatting)")
para("Per faalmodus is getoetst of de SOP de betreffende fout dekt en of de regel mechanisch afdwingbaar is. Resultaat: twaalf lacunes, alle van hetzelfde type — procedureel bestaand, mechanisch afwezig.")
tabel(["Gap", "Faalmodus", "Type lacune", "Ernst"],
      [["A1 Geen Phase-Entry Gate", "SOP-skip", "Mechanisering ontbreekt", "Hoog"],
       ["A2 Prompt-log timing ongecontroleerd", "SOP-skip", "Validatie ontbreekt", "Middel"],
       ["A3 GO-moment niet vastgelegd", "SOP-skip", "Artefact ontbreekt", "Middel"],
       ["B1 Geen output-eis in QC-taaktemplate", "QC zonder bestand", "Template-eis ontbreekt", "Hoog"],
       ["B2 Geen post-run artefact-check", "QC zonder bestand", "Check ontbreekt", "Hoog"],
       ["B3 Geen recovery-recept 'zonder artefact'", "QC zonder bestand", "Recept ontbreekt", "Hoog"],
       ["B4 Anti-corruptie: geen detectie/herstel", "Anti-corruptie", "Detectie ontbreekt", "Kritiek"],
       ["C1 Golden Standard niet gecodificeerd", "Structuur-afwijking", "Manifest ontbreekt", "Hoog"],
       ["C2 Geen pre-productie structuurdiff", "Structuur-afwijking", "Diff ontbreekt", "Hoog"],
       ["C3 Geen legacy/cleanup-check", "Structuur-afwijking", "Check ontbreekt", "Middel"],
       ["C4 Changelog niet tegen filesystem", "Structuur-afwijking", "Check ontbreekt", "Middel"]])
para("Alle vijf Quality Gates uit §5.3 liggen ná productie. De drie nieuwe gates (Phase-Entry, Artefact, Golden-Standard) vullen de lege fase vóór en tussen productiestappen. Volledige analyse met SOP-sectieverwijzingen en vijf concrete v8.9-wijzigingsvoorstellen: working/sop_audit.md.", kleur=AMBER)

# ---------- 5 ----------
h1("5. Oplossing — Deliverables Gatekeeper")
para("Eén script (scripts/deliverables_gatekeeper.py, Python 3, geen dependencies) met drie run-modes die exact op de drie risicomomenten in de pipeline draaien:")
tabel(["Mode", "Moment", "Afdwongen regels", "Effect bij FAIL"],
      [["entry", "Vóór eerste subagent-spawn", "7 Fase-1 submappen · project_prompts.log + datering · research/sources.md · GO-log (advies)", "Spawn geblokkeerd + fix-instructies"],
       ["artefact", "Direct na elke subagent-run", "Bestand bestaat · minimale grootte · formaatvalidatie (md/json/docx/html)", "Artefact Recovery Protocol (re-spawn, nooit zelf produceren)"],
       ["deliverables", "Vóór oplevering", "Golden Standard diff per documenttype · verboden combined-patronen · CHANGELOG vs filesystem · versietags · anti-corruptiescan", "Levering geblokkeerd + per-bestand fixes"]])
para("Aangevuld met het OUTPUT-CONTRACT: een standaardblok voor elke spawn-taak dat absoluut pad, bestandsnaam, formaat, minimale grootte en vereiste secties voorschrijft — de directe remedie voor misser 2.", bold=True)

# ---------- 6 ----------
h1("6. Validatie — live tests 24-08 21:32 UTC")
tabel(["Test", "Object", "Verwacht", "Resultaat"],
      [["1 deliverables", "Mercury 003057", "PASS", "6/6 structuur PASS; bonusbevinding: 2 minors in de referentie zelf (geen CHANGELOG, 3 bestanden zonder versietag)"],
       ["2 deliverables", "Chromium VI", "FAIL", "FAIL: 2 legacy-combined · CHANGELOG noemt 5 bestanden niet · anti-corruptiescan herkent 'Kas — Nood-QC' en markeert VOID"],
       ["3 entry", "Chromium VI", "FAIL", "FAIL: 3 submappen ontbreken (assets, correspondence, logs) · geen research/sources.md"],
       ["4 artefact", "foutanalyse.md (8,2 KB)", "PASS", "bestaat + grootte + heading-structuur"],
       ["5 artefact", "niet-bestaand pad", "FAIL", "FAIL + Recovery-Protocol-instructies, exit code 1"]])
para("Conclusie: de gatekeeper reproduceert alle drie de productiefouten van vanavond als automatische detectie. De borging werkt.", bold=True, kleur=GROEN)

# ---------- 7 ----------
h1("7. Aanbevelingen aan de Director")
para("1. Chromium VI-naloop (P1): verplaats de drie legacy-combined bestanden naar archive/, vul de CHANGELOG aan met een v1.1-splitsingsentry, markeer qa_report.md als VOID en laat een nieuwe onafhankelijke QC-subagent de volledige checklist heruitvoeren — inclusief de acht nu 'Onbekende' DOCX-inspecties.")
para("2. Adoptie gatekeeper (P1): installeer het script in /root/.openclaw/scripts/ en maak de drie modes verplichte stappen in de spawn-flow (pre-spawn, post-run, pre-levering).")
para("3. OUTPUT-CONTRACT (P2): neem het contractblok op in de standaard spawn-macro voor álle productie- en QC-taken.")
para("4. MASTER_SOP v8.9 (P2/P3): verwerk de vijf sectiewijzigingen uit working/sop_audit.md — §3.0 Phase-Entry Gate, §1.3 Artefact Recovery Protocol, §5.2 checks #13/#14, §3.5 Golden Standard Manifest, §5.4 VOID-detectie en herstel.")
para("5. Mercury zelf (P3): vul de referentie aan (CHANGELOG in deliverables/, versietags op html/json) zodat de Golden Standard 100% conform de eigen SOP is.")

# ---------- 8 ----------
h1("8. Bronnen en bewijsstukken")
for b in [
    "MASTER_SOP.md v8.8 (7 aug 2026) — §1.3, §1.13, §3, §3.5, §4.3, §5.2, §5.4, §6",
    "MASTER_STYLEGUIDE.md v1.5 — kleurpalet, typografie, logo-gebruik",
    "2026-audit-koole-mercury-003057/deliverables/ — fysieke structuur Golden Standard (gecontroleerd 24-08 21:28 UTC)",
    "2026-audit-koole-chromium-vi/deliverables/ — fysieke structuur incl. legacy-restanten (gecontroleerd 24-08 21:28 UTC)",
    "2026-audit-koole-chromium-vi/project_prompts.log — datering 20:38:16 UTC (bewijs SOP-skip)",
    "2026-audit-koole-chromium-vi/working/qa_report.md — 'Kas (Director) — Nood-QC' (bewijs anti-corruptie-overtreding)",
    "working/foutanalyse.md · working/sop_audit.md · working/verbeterplan.md · working/implementatie.md — volledige deelanalyses",
    "scripts/deliverables_gatekeeper.py — gevalideerd instrument (testrapport §6)",
]:
    doc.add_paragraph(b, style="List Bullet")

# Kernwoorden/metadata
cp = doc.core_properties
cp.title = "Uniforme Deliverables Borging — Repair Clan Rapport v1.0"
cp.author = "JvG Consultancy"
cp.keywords = "deliverables, gatekeeper, SOP, kwaliteitsborging, Mercury, Chromium VI"
cp.category = "Procesverbetering"

os.makedirs(os.path.dirname(OUT), exist_ok=True)
doc.save(OUT)
print(f"OK — {OUT} ({os.path.getsize(OUT)} bytes)")
