# README Dossier — Fase C "AI-Voorbereidingsdossiers"

Status: **LOKAAL AFGEROND & GETEST (53 passed)** — klaar voor productie-integratie door Kas.
Locaal werk: `/root/projects/jg/lgcc-proactieve-agenda/`. Productie-app (`/root/.openclaw/workspace/lions-gcc/`) is door deze fase NIET aangeraakt.

## Wat is er gebouwd

| Bestand | Inhoud |
|---|---|
| `dossier_module.py` | Volledige Fase C-module: `agenda_dossiers`-tabel (idempotente migratie), `genereer_dossier()` via `ai_complete` met prompts per agendatype (DOSSIER_DESIGN.md), kennisbank-context (max 3 fragmenten, LIKE op `knowledge_docs.original_name`/`content_text` — géén embeddings), statusflow, eindredactie, nieuwsbrief-seed en social-export. Zelfde registreerpatroon als Fase A/B. |
| `agenda_module.py` (patch, +2 cellen) | Extra kolom **Dossier** op `/agenda`: genereer-knop zodra een item binnen 14 dagen (T-14) ligt, daarna een statuslink naar het dossier. De koppeling staat in een try/except — zonder `dossier_module.py` draait de agenda gewoon door. |
| `tests/test_dossier.py` | 16 pytest-tests: migratie-idempotentie, generatie met gemockte `ai_complete`, kennisbank-fragment-in-de-prompt (assert op prompt-inhoud), AI-fout → `pending` + behoud oude inhoud, upsert zonder duplicaten, statusflow + ongeldige transities, eindredactie, admin-guard (403), nieuwsbrief-seed, social-export, T-14-knop op de agenda-pagina. |
| `README-dossier.md` | Dit bestand. |

### Routes (allemaal binnen de bestaande /agenda-flow — géén nieuwe navigatie-tab)

| Route | Methode | Guard | Doel |
|---|---|---|---|
| `/agenda/dossier/<item_id>/genereer` | POST | admin | Genereer/regenereer dossier voor agenda-item (één dossier per item, upsert). AI-fout → status `pending`, nooit fake-content. |
| `/agenda/dossier/<id>` | GET | leesbaar | Detailpagina: dossierinhoud (Markdown), statusbadge, knoppen *Regenereren* / *Markeer definitief* / *Terug naar concept* / *Gebruik in nieuwsbrief* / *Social-ready (JSON)*, en een eindredactie-textarea die `inhoud_md` opslaat. |
| `/agenda/dossier/<id>/status` | POST | admin | Statusflow: alleen `concept→definitief` en `definitief→concept` (`pending` zet alleen het systeem). |
| `/agenda/dossier/<id>/bewerken` | POST | admin | Eindredactie: slaat bewerkte inhoud op als `inhoud_md` (lege tekst wordt geweigerd). |
| `/agenda/dossier/<id>/naar-nieuwsbrief` | POST | admin | Voegt het dossier als **seed** toe aan de bestaande `newsletter_content_pool` (content_type `text`, categorie `agenda`) — daarna kies je het in de bestaande generator. Geen duplicaat-editor. |
| `/agenda/dossier/<id>/social-export` | GET | leesbaar | JSON-download met de **talking points** als kant-en-klare payloads (instagram/linkedin/facebook) voor de bestaande `POST /api/social/generate`. Geen duplicaat-generator. |

### Dossiertypes (automatisch herkend op het agenda-type)
`kabinetsvergadering` · `gouverneursraad` · `conventie` · `zonebijeenkomst` · `nieuwsbrief` · `campagne` · `training` · `standaard` — elk met eigen focus-blok in de prompt. Vaste dossierkoppen: **Kernkaart · Context · Checklist voorbereiding · Talking points (stijl "Samen Verder Bouwen") · Open vragen aan de DG**.

### Statusflow
`pending` (AI-storing; retry via Regenereren) → `concept` (AI-levering, bewerkbaar) → `definitief` (DG-vink). Mislukte regeneratie behoudt de vorige inhoud.

---

## Integratie in de productie-app (stappen voor Kas)

**Stap 1 — bestand kopiëren**
```bash
cp /root/projects/jg/lgcc-proactieve-agenda/dossier_module.py \
   /root/.openclaw/workspace/lions-gcc/dossier_module.py
```

**Stap 2 — app.py: import + registratie** (vlak bij de bestaande module-registraties, direct ná `register_agenda_routes(app, page, BASE_PATH, ai_complete, db)` — productie-app.py regel ≈ 2430):
```python
from dossier_module import register_dossier_routes
register_dossier_routes(app, page, BASE_PATH, ai_complete, db)
```
De registratie draait automatisch de idempotente migratie: tabel `agenda_dossiers` (kolommen `id, agenda_item_id, gegenereerd_op, type, status default 'concept', inhoud_md, ai_model`) + index. Bestaande data in `/app/data/lions_gcc.db` wordt niet aangeraakt.

**Stap 3 — agenda_module.py in productie: dossier-kolom** (kleine patch, of kopieer de lokale versie over — de enige functionele wijziging t.o.v. productie is deze kolom):
1. Voeg vóór `def _row(i):` in `agenda_overview` toe:
```python
def _dossier_kolom(i):
    """Fase C-koppeling: dossier-knop/link zodra T-14 bereikt (lean, optioneel)."""
    try:
        from dossier_module import render_dossier_kolom
        return render_dossier_kolom(db_module, i, BASE_PATH)
    except Exception:
        return ''  # dossier_module niet aanwezig → agenda werkt gewoon door
```
2. Voeg in de return van `_row(i)` als laatste `<td>` toe: `f'<td>{_dossier_kolom(i)}</td>'` (vóór `</tr>`).
3. Zet in de tabelheader achter `<th>Status</th>` een `<th>Dossier</th>` en verhoog de colspan van de lege-rijen van 5 naar 6.

**Stap 4 — herstart de app** en verifieer:
1. `/agenda` → items binnen 14 dagen tonen een 🆕-dossierknop; de rest niet.
2. Knop → dossier-detail met status `concept` (EERSTE echte AI-call — duurt 30-60s).
3. Eindredactie opslaan → *Markeer definitief*.
4. *Gebruik in nieuwsbrief* → item verschijnt in de content pool op `/newsletter?tab=pool`.
5. *Social-ready (JSON)* → download met payloads voor `/api/social/generate`.
6. Terminal check: `sqlite3 /app/data/lions_gcc.db "SELECT id, agenda_item_id, status, ai_model, length(inhoud_md) FROM agenda_dossiers;"`

## Gedraging/afspraken
- **Admin-guard**: alle schrijfacties (genereer/status/bewerken/naar-nieuwsbrief) checken extra op de sessie (`session.authenticated`/`user_id`) naast de bestaende globale login-check van de app.
- **AI-foutbeleid**: nooit fake-content. Fout → dossier(regel) op `pending`, vorige inhoud blijft staan, herstel via *Regenereren*.
- **Lean**: géén nieuwe navigatie-tab, géén nieuwsbrief-/social-duplicaat, kennisbank via gewone LIKE-queries (max 3 fragmenten), één dossier per agenda-item (upsert bij regeneratie).

## Hoe lokaal getest
```bash
cd /root/projects/jg/lgcc-proactieve-agenda
python3 -m pytest tests/ -v     # 53 passed (Fase A 8 + Fase B 29 + Fase C 16)
```
