Geef je bedrijf een geheugen. Aan het einde van dit werkboek staan er twee breinen achter je n8n: één dat onthoudt wat er is gebeurd, één dat onthoudt hoe het hoort. En een frontje met je eigen naam waar jij en je team mee praten.
Cortex zonder flows is een leeg archief. Zet daarom vóór dit werkboek deze drie processen zoveel mogelijk in n8n, met Claude als bouwer:
Elke flow die daar iets waardevols oplevert (een gesprek, een besluit, een betaling, feedback) wordt straks in stap 4 aangesloten op Cortex.
In deel 1 kende je vijf onderdelen van een flow: Signaal, Brein, Geheugen, Handen, Mens. Vandaag krijgt het Geheugen een naam en krijgt het Brein een geweten.
Onthoudt wat er is gebeurd. Elke betaling, elk gesprek, elke aanvraag, elk besluit. Met tijdstempel, bron en de persoon waar het bij hoort.
Leeft in Supabase. Gevuld door je n8n-flows via één voordeur.
Cortex is niet slim. Cortex is compleet. Dat is de hele truc.
Onthoudt hoe het hoort. Je kaders, elk met twee kanten: zo doen wij het wel, zo doen wij het niet. Jouw oordeel, opgeschreven, zodat je team het niet meer aan jou hoeft te vragen.
Leeft als kaders in GitHub. Elke nacht ingelezen in Supabase. Groeit elke week via één Slack-kanaal waarin jij je oordeel geeft.
Atlas vervangt je oordeel niet. Atlas bewaart het.
Je archief met geheugen. Hier leven de kaders van Atlas. Elke wijziging wordt bewaard, dus je ziet altijd wanneer een kader veranderde en waarom.
Bouwt het frontje. Bolt doet niets anders dan front-end en is daar beter en goedkoper in dan Claude. Claude schrijft de prompt en leest de code na.
Geeft het frontje een plek op internet, gratis, met een slot op de deur zodat alleen jouw team erbij kan.
GitHub is een opslagplaats voor tekstbestanden die alles onthoudt. Programmeurs gebruiken het voor code. Jij gebruikt het voor je kaders: één map, één soort notitie, met in elke notitie wat wel goed is en wat niet.
atlas. Zet hem op Private. Vink Add a README aan. Klik Create repository.atlas. Permissie: Contents, Read and write. Niets anders. Bewaar de token in je wachtwoordmanager, je hebt hem nodig in stap 3.atlas.kaders.Je bent mijn Atlas-beheerder. Atlas is de verzameling kaders waarin staat hoe wij in ons bedrijf werken. Een kader beschrijft altijd twee kanten: zo doen wij het wel, en zo doen wij het niet. Maak in mijn GitHub-repository "atlas" deze structuur aan: - kaders/ één markdown-bestand per kader - README.md uitleg van de structuur in drie zinnen Elk kader is een markdown-bestand met bovenaan: --- titel: <korte titel> domein: <financieel | sales | service | team | algemeen> geldig_vanaf: <datum> bron: <wie dit heeft besloten> --- Daarna twee kopjes, samen maximaal 300 woorden, in gewone taal, geschreven zodat een nieuwe medewerker het zonder uitleg begrijpt: ## Zo wel ## Zo niet Bestandsnaam: domein-korte-titel.md, kleine letters, streepjes, geen spaties. Stel mij nu één voor één deze drie vragen en maak na elk antwoord het kader aan in kaders/: 1. Hoe bepalen wij de prijs van een offerte? 2. Wat doen wij als een klant een klacht heeft? 3. Wat doen wij nooit, ook niet als de klant erom vraagt? Vraag door als een antwoord vaag is. Schrijf niets op dat ik niet heb gezegd.
Cortex is een handvol tabellen. Atlas is één tabel met een ingebouwd zoekmodel van Supabase, dus zonder extra sleutel of abonnement. Je typt geen SQL. Je geeft Claude twee prompts en controleert het resultaat.
cortex_ingest_key. Je gebruikt hem in stap 2, 3 en 7.cortex_ of atlas_. Elke tabel toont een slotje: RLS enabled. Onder Edge Functions staat atlas-balie op Active.Je bent mijn database-architect. Bouw in mijn Supabase-project de basis van Cortex (het geheugen van mijn bedrijf) en Atlas (de kaders van mijn bedrijf). Gebruik de Supabase-connector en voer alles uit als migraties. Leg mij per stap in één zin uit wat je doet. Maak deze tabellen in schema public: 1. cortex_people: id (uuid, pk), email (text, uniek, lowercase), naam (text), organisatie (text), type (text: klant | lead | medewerker | leverancier | overig), aangemaakt_op (timestamptz default now()), bijgewerkt_op (timestamptz). 2. cortex_events: id (uuid, pk), gebeurd_op (timestamptz, verplicht), type (text, verplicht, bijv. betaling_ontvangen, gesprek_gevoerd, aanvraag_binnen, besluit_genomen, chat_vraag), bron (text, verplicht: de naam van de flow of het systeem), persoon_id (uuid, fk naar cortex_people, mag leeg), samenvatting (text, verplicht, max 500 tekens), payload (jsonb), externe_id (text), aangemaakt_op (timestamptz default now()). Unieke index op (bron, externe_id) waar externe_id niet leeg is, zodat dezelfde gebeurtenis nooit twee keer wordt opgeslagen. 3. cortex_documents: id (uuid, pk), titel (text), inhoud (text, verplicht), type (text: transcript | verslag | email | notitie | overig), bron (text), persoon_id (uuid, fk), event_id (uuid, fk naar cortex_events), aangemaakt_op (timestamptz default now()). Voeg een tsvector-kolom toe met een GIN-index voor Nederlandse full-text search op titel en inhoud. 4. atlas_chunks: id (bigint, pk, identity), pad (text, uniek, verplicht: het bestandspad in GitHub), titel (text), domein (text), inhoud (text, verplicht), hash (text), embedding (vector(384)), bijgewerkt (timestamptz). Zet de extensie vector aan. 5. atlas_gaten: id (bigint, pk, identity), vraag (text, verplicht), context (text), gesteld_door (text), ontstaan_op (timestamptz default now()), status (text default 'open': open | gesteld | beantwoord | afgewezen), slack_ts (text), gesteld_op (timestamptz), antwoord (text), beantwoord_op (timestamptz), kader_pad (text). Dit zijn de vragen waar Atlas geen kader voor had. 6. cortex_fouten: id (uuid, pk), ontstaan_op (timestamptz default now()), flow (text), categorie (text), melding (text), payload (jsonb), opgelost (boolean default false). Verder: - Zet Row Level Security AAN op alle zes tabellen en maak GEEN policies voor de rollen anon en authenticated. Alleen de service_role (die n8n en de Edge Function gebruiken) mag lezen en schrijven. Bevestig mij expliciet dat een anonieme gebruiker niets kan lezen. - Maak een SQL-functie match_atlas(query_embedding vector(384), match_count int default 6) die de meest gelijkende rijen uit atlas_chunks teruggeeft (pad, titel, domein, inhoud, gelijkenis) op cosine-afstand. - Maak een SQL-functie zoek_cortex(zoekterm text, aantal int default 8) die full-text zoekt in cortex_documents en tegelijk in cortex_events.samenvatting (ilike), en één lijst teruggeeft met soort, datum, bron, titel, tekst. - Maak een view v_laatste_week met alle events van de afgelopen 7 dagen, nieuwste eerst, met de naam van de persoon erbij. - Maak een view v_atlas_gaten_open met alle gaten met status open of gesteld, oudste eerst. Als alles staat: geef mij een lijst van de tabellen met per tabel het aantal kolommen en de bevestiging dat RLS aan staat.
Zet in mijn Supabase-project een Edge Function live met de naam "atlas-balie". Gebruik de Supabase-connector om hem te deployen. Dit is de enige plek waar tekst in zoekbare getallen wordt omgezet. Gebruik daarvoor het ingebouwde model van de Supabase Edge Runtime: new Supabase.ai.Session('gte-small'), met mean_pool en normalize aan. Geen externe API, geen extra sleutel.
Beveiliging:
- Elke aanroep moet de header x-cortex-key dragen. Vergelijk die met de omgevingsvariabele ATLAS_KEY. Klopt hij niet: status 401, stop.
- Zet verify_jwt UIT voor deze functie (de header-sleutel is de poort; n8n heeft geen gebruikers-JWT).
- Gebruik in de functie de service_role key uit de omgevingsvariabelen van Supabase zelf; zet nooit een sleutel in de code.
Routes (alleen POST, JSON in en uit):
1. /ingest: body { notities: [ { pad, titel, domein, inhoud } ] }, maximaal 10 per aanroep. Per notitie: bereken sha256 van inhoud; bestaat het pad al met dezelfde hash, tel als ongewijzigd en sla over. Anders: maak een embedding van titel + inhoud (maximaal 6000 tekens) en upsert in atlas_chunks op pad. Antwoord { ok, nieuw, bijgewerkt, ongewijzigd }.
2. /verwijder: body { paden: [ ... ] }. Verwijdert die rijen uit atlas_chunks. Antwoord { ok, verwijderd }.
3. /vraag: body { vraag, aantal (default 6) }. Maak een embedding van de vraag, roep match_atlas aan, filter treffers met gelijkenis onder 0.25 weg. Antwoord { vraag, gevonden, kaders: [ { pad, titel, domein, tekst, gelijkenis } ], gebruik } waarbij gebruik een korte instructie is: bij nul treffers "Atlas heeft hier nog geen kader over. Zeg dat letterlijk en verzin er geen." en anders "Noem bij elk kader het pad. Bij tegenspraak wint Atlas voor het oordeel en Cortex voor het feit."
Vraag mij daarna om mijn cortex_ingest_key en zet die als secret ATLAS_KEY bij de functie (Supabase Edge Function secrets), niet in de code. Test daarna /vraag met de vraag "Hoe bepalen wij de prijs van een offerte?" met de sleutel in de header. Verwacht: gevonden 0, want de sync uit stap 3 heeft nog niet gedraaid. Laat mij het antwoord zien.
Drie flows dragen het systeem: de voordeur, de nachtsync en het gesprek. Bouw ze in deze volgorde en test elke flow voordat je de volgende start. De twee flows voor het weekritme komen in stap 7.
x-cortex-key en als waarde je cortex_ingest_key. Claude kan credentials niet voor je aanmaken, dit is jouw stap.Bouw in mijn n8n een workflow met de naam "CORTEX 0 Ingest v1". Dit is de enige voordeur van mijn bedrijfsgeheugen.
Trigger: Webhook, method POST, pad "cortex-ingest", beveiligd met de Header Auth-credential "x-cortex-key". Gebruik de productie-URL, niet de test-URL.
Verwacht deze JSON:
{ "type": "...", "bron": "...", "gebeurd_op": "ISO-datum", "samenvatting": "...", "email": "optioneel", "naam": "optioneel", "externe_id": "optioneel", "payload": {}, "document": { "titel": "optioneel", "inhoud": "optioneel", "type": "optioneel" } }
Stappen:
1. Valideer: type, bron, gebeurd_op en samenvatting zijn verplicht. Ontbreekt er iets, antwoord dan met status 400 en een duidelijke foutmelding, en schrijf de fout ook in cortex_fouten (flow = CORTEX 0 Ingest, categorie = VALIDATIE).
2. Als er een email is: zoek de persoon in cortex_people op lowercase email. Bestaat hij niet, maak hem aan. Zet alwaysOutputData aan op de zoek-node zodat de flow niet stilvalt bij nul resultaten.
3. Schrijf de gebeurtenis naar cortex_events. Gebruik een upsert op (bron, externe_id) zodat dezelfde gebeurtenis nooit dubbel wordt opgeslagen.
4. Als er een document met inhoud is: schrijf het naar cortex_documents, gekoppeld aan het event en de persoon.
5. Antwoord met status 200 en { "ok": true, "event_id": "..." }.
6. Foutpad: elke fout in stap 2 t/m 4 eindigt in een rij in cortex_fouten en daarna in een Stop and Error node. Nooit stil doorgaan.
Zet in de workflow-settings een Error Workflow (maak "Error Vangnet v1" aan als die nog niet bestaat: hij logt elke fout in cortex_fouten). Publiceer de workflow, lees daarna de actieve versie terug en laat mij zien dat de webhook-URL en de header-beveiliging kloppen. Stuur dan één testgebeurtenis met bron "test" en laat mij de rij zien.
Bouw in mijn n8n een workflow "ATLAS 1 Sync v1" die elke nacht om 03:00 (Europe/Amsterdam) mijn GitHub-repository "atlas" inleest via de Atlas-balie. GitHub is de enige bron van waarheid; deze flow is de enige die atlas_chunks vult.
Gebruik de GitHub-node met mijn credential "GitHub" (alleen lezen is genoeg voor deze flow) en de HTTP Request-node met de Header Auth-credential "x-cortex-key" voor de balie.
Stappen:
1. Haal alle .md-bestanden op uit de map kaders/ (recursief).
2. Lees per bestand de kop (titel, domein) en de inhoud.
3. Stuur ze in groepjes van maximaal 10 naar POST https://<mijn-project>.supabase.co/functions/v1/atlas-balie/ingest als { notities: [ { pad, titel, domein, inhoud } ] }. De balie slaat ongewijzigde bestanden zelf over.
4. Tel na: nieuw + bijgewerkt + ongewijzigd uit de antwoorden moet gelijk zijn aan het aantal verstuurde notities. Klopt dat niet, faal dan hard: dat betekent dat er stilletjes iets is weggevallen.
5. Haal alle paden uit atlas_chunks op en stuur paden die niet meer in GitHub bestaan naar /verwijder.
6. Meld NIET bij succes. Meld alleen bij een fout: schrijf naar cortex_fouten en eindig in Stop and Error.
Koppel het Error Vangnet. Publiceer, lees de actieve versie terug, en voer de flow één keer handmatig uit. Laat mij daarna zien hoeveel rijen er in atlas_chunks staan, van welke paden, en dat de kolom embedding gevuld is.
Bouw in mijn n8n een workflow "CORTEX 1 Chat v1": de plek waar ik en mijn team met het bedrijf praten.
Trigger: Webhook, method POST, pad "cortex-chat", antwoord via Respond to Webhook. Verwacht { "vraag": "...", "gebruiker": "email" } en een header Authorization: Bearer <Supabase access token>.
Stappen:
1. Toegangscontrole: stuur het token naar https://<mijn-project>.supabase.co/auth/v1/user (GET, header apikey = anon key, header Authorization = het token). Krijg je geen 200 terug, antwoord dan met status 401 en stop. Controleer daarna dat het e-mailadres uit het antwoord voorkomt in de lijst TOEGESTAAN die je bovenin de flow als vaste lijst zet (ik vul hem in). Staat het er niet in: 403.
2. AI Agent-node met een Anthropic-model (Claude Sonnet) en twee tools:
- vraag_atlas: POST naar de Atlas-balie /vraag met de Header Auth-credential x-cortex-key, body { vraag }. Geeft de kaders terug met pad.
- vraag_cortex: roept de Supabase-functie zoek_cortex aan met een zoekterm, en haalt daarnaast de laatste 30 rijen uit v_laatste_week op.
Systeemprompt voor de agent:
"Je bent het geheugen van dit bedrijf. Beantwoord vragen over hoe iets hoort ALTIJD eerst via vraag_atlas. Beantwoord vragen over wat er is gebeurd via vraag_cortex. Noem bij elk antwoord de bron: het pad van het kader, of de datum en bron van de gebeurtenis. Als Atlas geen kader heeft over een onderwerp, zeg dat letterlijk: hierover staat nog geen kader in Atlas, en zeg dat de vraag is doorgegeven aan de eigenaar. Verzin nooit een kader. Antwoord kort, in het Nederlands, zonder aanhalingstekens en zonder uitroeptekens. Eindig je antwoord met een aparte regel GAT: ja of GAT: nee, afhankelijk van of er een kader ontbrak."
3. Lees de regel GAT uit het antwoord en haal hem uit de tekst die de gebruiker ziet. Staat er GAT: ja, schrijf dan een rij in atlas_gaten met vraag = de vraag van de gebruiker, context = het antwoord, gesteld_door = gebruiker, status = open. Bestaat er al een open gat met dezelfde vraag (case-insensitive), maak dan geen nieuwe.
4. Schrijf vraag en antwoord als event naar cortex_events (type = chat_vraag, bron = CORTEX 1 Chat, email = gebruiker) via de ingest-webhook uit 3A, zodat ook gesprekken worden onthouden.
5. Antwoord met { "antwoord": "...", "bronnen": [...], "gat": true|false }.
6. Fouten in tools mogen de flow niet stil laten doorlopen: controleer of een tool-antwoord een foutmelding bevat en log dat in cortex_fouten.
Zet retryOnFail (5 pogingen, 5 seconden) op de Anthropic-node. Koppel het Error Vangnet. Publiceer, lees de actieve versie terug, en test twee keer: eerst met "Hoe bepalen wij de prijs van een offerte?" (verwacht: antwoord met pad, gat false), daarna met "Wat doen wij als een medewerker te laat komt?" (verwacht: geen kader, gat true, en een nieuwe rij in atlas_gaten).
Vanaf nu geldt in je bedrijf één regel: elke flow die iets waardevols oplevert, stuurt dat door naar de voordeur. Een betaling, een gesprek, een aanvraag, een besluit, een klacht. Zonder uitzondering.
Open mijn n8n-workflow "<NAAM VAN DE FLOW>". Voeg aan het einde van het succespad één HTTP Request-node toe met de naam "Post naar Cortex": - POST naar mijn webhook /webhook/cortex-ingest, met de Header Auth-credential x-cortex-key. - Body: type = "<TYPE, bijv. betaling_ontvangen>", bron = "<NAAM VAN DE FLOW>", gebeurd_op = het tijdstip uit de data (anders now), samenvatting = één zin van maximaal 200 tekens die een mens begrijpt, email en naam van de betrokken persoon als die bekend zijn, externe_id = de unieke sleutel uit het bronsysteem (order-id, gespreks-id, formulier-id), payload = de relevante velden. - Als de flow een lange tekst oplevert (transcript, verslag, mail): zet die in document.inhoud met een titel en type. - De node mag de rest van de flow niet blokkeren: bij een fout gaat de melding naar cortex_fouten, niet naar de gebruiker. Publiceer, lees de actieve versie terug en laat mij de nieuwe node zien. Voer de flow daarna één keer uit met echte of testdata en toon mij de rij in cortex_events.
Bolt is gemaakt voor front-end en doet niets anders. Claude is extreem goed in code lezen en bijsturen. Samen zijn ze beter en goedkoper dan elk apart. Zo werk je: Claude schrijft de prompt, Bolt bouwt, Claude leest na.
cortex-front.Schrijf voor mij een volledige prompt voor bolt.new die een kleine, veilige chat-app bouwt met de naam "<NAAM VAN MIJN FRONTJE>". Ik plak jouw output letterlijk in Bolt, dus schrijf hem als één samenhangende opdracht aan Bolt.
Eisen aan de app:
- React + Vite, geen backend van Bolt zelf, geen eigen database.
- Inloggen via Supabase Auth (e-mail en wachtwoord). Supabase-URL en anon key komen uit omgevingsvariabelen VITE_SUPABASE_URL en VITE_SUPABASE_ANON_KEY, nooit hardcoded in de code.
- Na inloggen: één chatscherm. De gebruiker typt een vraag. De app stuurt POST naar mijn n8n-webhook <CHAT-WEBHOOK-URL> met body { vraag, gebruiker: e-mail van de ingelogde gebruiker } en header Authorization: Bearer <het Supabase access token van de sessie>. De webhook-URL komt uit VITE_CHAT_URL.
- Toon het antwoord en daaronder de bronnen (pad van de Atlas-notitie of datum en bron van een gebeurtenis) als kleine labels.
- Gesprekgeschiedenis alleen in het geheugen van de pagina, niet opslaan in de browser.
- Twee knoppen boven het invoerveld: "Wat is er gebeurd" en "Hoe hoort het", die een voorbeeldvraag invullen.
- Uitlogknop. Foutmelding in gewone taal als de webhook 401 of 403 geeft: "Je hebt geen toegang. Vraag de eigenaar om je adres toe te voegen."
- Stijl: rustig, donkere achtergrond, warme tinten, grote leesbare letters (minimaal 18px), geen cursief. Mijn naam bovenaan.
- Maak een .env.example met de drie variabelen, en een korte README met hoe je de app lokaal start en op Cloudflare Pages zet.
Vraag mij eerst om de drie waarden (Supabase-URL, anon key, chat-webhook-URL) en verwerk ze als voorbeeldwaarden in .env.example, niet in de code.
Lees mijn GitHub-repository "cortex-front" volledig na. Controleer deze vier dingen en rapporteer per punt: goed of fout, met het bestand en de regel: 1. Staan er ergens sleutels, URL's of wachtwoorden hardcoded in de code in plaats van in omgevingsvariabelen? 2. Wordt bij elke aanroep van de chat-webhook het Supabase access token meegestuurd als Bearer-header? 3. Praat de app ergens rechtstreeks met Supabase-tabellen (supabase.from(...))? Dat mag niet: alleen auth en de webhook. 4. Wordt er iets in localStorage of sessionStorage opgeslagen behalve wat Supabase Auth zelf nodig heeft? Schrijf voor elk foute punt één korte correctieprompt die ik in Bolt kan plakken. Schrijf de code niet zelf, Bolt doet dat.
Cloudflare Pages haalt je code uit GitHub en zet hem op internet. Elke keer dat Bolt iets wijzigt, staat het binnen een minuut live. Vercel kan ook; wij tonen Cloudflare.
cortex-front.npm run build, output directory dist.Dit is het stuk waardoor Atlas elke week beter wordt. Niet omdat jij bedenkt wat er in moet, maar omdat Atlas jou vraagt wat hij mist. Vrijdagmiddag krijg je per gat één bericht in Slack. Jij typt je oordeel in de thread, of zet een kruisje als er geen kader nodig is. Maandagochtend staat het in Atlas.
#atlas. Alleen jij en je bot hoeven erin. Klik op de kanaalnaam, scroll naar beneden en kopieer de Channel ID (begint met C).chat:write, channels:history, channels:read, reactions:read, users:read. Klik Install to Workspace en kopieer de Bot User OAuth Token.#atlas: /invite @jouwbot. Zonder die invite blijft de flow groen en stil.#atlas. Typ je oordeel in de thread. Draai 7B handmatig. Controleer dat er een nieuw bestand in GitHub kaders/ staat en dat Atlas de vraag nu wél beantwoordt in je frontje.Bouw in mijn n8n een workflow "ATLAS 2 Weekvraag v1". Elke vrijdag om 16:00 (Europe/Amsterdam) legt hij mij de open gaten van Atlas voor in Slack. Ook handmatig te starten via POST /webhook/atlas-weekvraag met de Header Auth-credential x-cortex-key. Vaste waarden bovenin de flow, in één Set-node: KANAAL = <CHANNEL ID>, EIGENAAR = <MEMBER ID>, MAX_GATEN = 10. Stappen: 1. Haal alle gaten op uit atlas_gaten met status open, oudste eerst, maximaal MAX_GATEN. 2. Zijn er nul gaten: stuur geen bericht, eindig stil. Stilte is hier normaal. 3. Zijn er gaten: stuur eerst één kopbericht in KANAAL: "Atlas mist deze week N kaders. Per bericht hieronder: typ je oordeel in de thread, of zet een kruisje als er geen kader nodig is." Als er meer open gaten waren dan MAX_GATEN, noem dat aantal in het kopbericht. 4. Stuur daarna per gat één eigen bericht in KANAAL met: de vraag, wie hem stelde, wanneer, en tussen haakjes het gat-id. Zet als bot alvast de reactie :x: onder het bericht, zodat ik hem alleen hoef aan te klikken. 5. Sla per gat de slack_ts van het bericht op in atlas_gaten en zet de status op gesteld en gesteld_op op nu. Koppel het antwoord van Slack aan het juiste gat via het gat-id dat in de berichttekst staat, nooit op volgorde. 6. Tel na: het aantal bijgewerkte rijen moet gelijk zijn aan het aantal verstuurde berichten. Klopt dat niet, faal dan hard. 7. Foutpad naar cortex_fouten en Stop and Error. Koppel het Error Vangnet. Publiceer, lees de actieve versie terug en draai de flow één keer handmatig. Laat mij zien welk gat is voorgelegd en dat de status in atlas_gaten nu gesteld is.
Bouw in mijn n8n een workflow "ATLAS 3 Oogst v1". Elke maandag om 07:30 (Europe/Amsterdam) leest hij mijn antwoorden uit Slack en maakt er kaders van in GitHub. Ook handmatig te starten via POST /webhook/atlas-oogst met de Header Auth-credential x-cortex-key. Vaste waarden bovenin, in één Set-node: KANAAL = <CHANNEL ID>, EIGENAAR = <MEMBER ID>. Stappen, per gat met status gesteld: 1. Lees de reacties op het bericht (slack_ts) en de replies in de thread. Alleen reacties en replies van EIGENAAR tellen; alles van anderen negeer je. 2. Staat er een :x: van EIGENAAR: zet status op afgewezen, plaats in de thread "Geen kader nodig, opgeruimd." en ga door. 3. Staat er tekst van EIGENAAR in de thread: stuur de vraag, de context en mijn tekst naar een Anthropic-node (Claude Haiku, max_tokens 800) met de opdracht: schrijf één kader als markdown volgens dit sjabloon, uitsluitend op basis van wat de eigenaar zei, niets erbij verzinnen: --- titel: <korte titel> domein: <financieel | sales | service | team | algemeen> geldig_vanaf: <datum van vandaag> bron: eigenaar, via Slack --- ## Zo wel ## Zo niet Laat Claude ook een bestandsnaam voorstellen: domein-korte-titel.md, kleine letters, streepjes. 4. Schrijf het bestand naar GitHub in kaders/ met de GitHub-credential. Bestaat het pad al, werk het dan bij (haal eerst de sha op), anders maak het aan. Commitbericht: "Kader uit weekoogst: <titel>". 5. Zet status op beantwoord, antwoord = mijn tekst, beantwoord_op = nu, kader_pad = het pad. Plaats in de thread: "Vastgelegd als kaders/<bestand>." 6. Is er geen :x: en geen tekst: laat het gat op gesteld staan. Ik kan volgende week alsnog antwoorden in dezelfde thread. 7. Na alle gaten: start de workflow "ATLAS 1 Sync v1" (Execute Workflow-node), zodat de nieuwe kaders meteen in atlas_chunks staan en niet pas vannacht. 8. Stuur één weekbericht in KANAAL: "Weekoogst: X kaders toegevoegd, Y opgeruimd, Z nog open." Dit is het enige succesbericht in het hele systeem. 9. Faalt één gat (bijvoorbeeld GitHub weigert), dan blijft alleen dat gat op gesteld staan en gaan de andere gewoon door. Log de fout in cortex_fouten. Koppel het Error Vangnet. Publiceer, lees de actieve versie terug en draai de flow één keer handmatig nadat ik in Slack heb geantwoord. Laat mij het nieuwe bestand in GitHub zien en de rij in atlas_gaten met status beantwoord.
Je bouwt nu een systeem dat alles over je bedrijf weet. Hoe gevoeliger de data, hoe meer je bedrijf waard is. En hoe meer waard, hoe beter je het afsluit. Loop deze lijst vandaag na, niet volgende maand.
| Onderdeel | Kosten | Opmerking |
|---|---|---|
| Hostinger KVM 2 met n8n | ± 8 euro per maand | Uit deel 1. Vast bedrag, ongeacht het aantal runs. |
| Supabase | Gratis | Gratis tier volstaat lang. Let op: een gratis project pauzeert na een week zonder verkeer; je nachtsync voorkomt dat. |
| GitHub | Gratis | Privé-repositories zitten in het gratis plan. |
| Cloudflare Pages + Access | Gratis | Access gratis tot 50 gebruikers. |
| Bolt | Betaald, maandabonnement | Alleen nodig zolang je aan het frontje bouwt. Daarna opzegbaar; de code staat in GitHub. |
| Anthropic API | Enkele tientjes tegoed | Uit deel 1. Zet een uitgavenlimiet. |
| Slack | Gratis | Het gratis plan volstaat voor het weekritme. |
| Zoekmodel voor Atlas | Gratis | Ingebouwd in Supabase Edge Functions (gte-small). Geen extra sleutel. |
Je bedrijf draait beter omdat je stuurt op feiten. Elke gebeurtenis wordt onthouden, elk kader is vindbaar. Je team vraagt Atlas, niet jou.
Een nieuw idee lanceren of een pivot maken gaat sneller, want de data ligt er al. Je hoeft niet meer te gissen wat je klanten deden.
Bij een verkoop is een bedrijf met een compleet, gestructureerd geheugen meer waard dan een bedrijf waar alles in hoofden zat. Vanaf vandaag telt elke kilobyte mee.
Eén handeling voor vandaag: stel je frontje één vraag waar je team elke week mee bij je aanklopt. Vrijdag staat hij in Slack, maandag weet je bedrijf het.
In één sessie leggen we jouw processen op de scorekaart, kiezen we welke drie het meeste opleveren en bepalen we de bouwvolgorde. Alleen voor MKB-ondernemers met een team en een bv.