Project: ERPNext Anthropic Claude Development Skill Package
Laatste update: 18 januari 2026
Doel: Documentatie van alle geleerde lessen tijdens development
De belangrijkste technische ontdekking van het project.
Server Scripts draaien in een RestrictedPython sandbox waar ALLE import statements geblokkeerd zijn:
# ❌ FOUT - Werkt NIET in Server Scripts
from frappe.utils import nowdate, getdate
import json
# ✅ CORRECT - Alles via frappe namespace
date = frappe.utils.nowdate()
data = frappe.parse_json(json_string)Pre-loaded in sandbox:
frappe- Volledig frameworkfrappe.utils.*- Utilities (ZONDER import)jsonmodule (viafrappe.parse_json,frappe.as_json)dict,list,_dict- Data structures
| Aspect | Client Script | Server Script |
|---|---|---|
| Runs in | Browser (JavaScript) | Server (Python sandbox) |
| Access | DOM, UI, frm object | Database, documents |
| Imports | Normal JS imports | ❌ GEEN imports toegestaan |
| Debugging | Browser console | Server logs |
| Wanneer | Kies |
|---|---|
| Custom app development | Document Controller |
| Quick customization zonder code deployment | Server Script |
| Complex multi-document logic | Document Controller |
| Simple field validation | Server Script |
Kritieke volgorde bij app loading:
app_include_js/css- Geladen op elke paginadoc_events- Per DocType event handlersscheduler_events- Cron-achtige taken
Anti-pattern: Circular imports in hooks.py → Gebruik lazy loading.
Altijd research document maken VOORDAT skill development begint:
┌─────────────────────────────────────────────────────────────────────┐
│ 1. Research Document (docs/research/research-[topic].md) │
│ └─→ Officiële docs + GitHub source verificatie │
│ │
│ 2. Skill Development (skills/source/[cat]/[skill]/) │
│ └─→ SKILL.md + references/ gebaseerd op research │
│ │
│ 3. Packaging & Validatie │
│ └─→ quick_validate.py + package_skill.py │
└─────────────────────────────────────────────────────────────────────┘
Split een fase wanneer:
- Research document > 700 regels
- Meer dan 5 reference files nodig
- Meer dan 8-10 secties in één skill
| Document | Functie |
|---|---|
| ROADMAP.md | Actuele project status |
| Masterplan | Oorspronkelijke visie |
| Amendments | Specifieke wijzigingen |
| LESSONS.md | Technische & proces lessen |
- Claude's filesystem reset tussen sessies
- ALTIJD pushen naar GitHub na elke fase
- Grote taken opsplitsen in meerdere conversaties
STAP 0: CONTEXT OPHALEN (verplicht)
├── Haal ROADMAP.md op
├── Haal relevant research document op
└── Bevestig output locaties
STAP 1-N: Uitvoering
└── Concrete, verifieerbare deliverables
LAATSTE STAP: Push naar GitHub
Na elke AI-gegenereerde output:
- ✅ Structuur klopt?
- ✅ Inhoud correct?
- ✅ Gepusht naar GitHub?
- ✅ ROADMAP bijgewerkt?
skill-name/
├── SKILL.md ← DIRECT in root (VERPLICHT)
└── references/ ← Detail documentatie
├── methods.md
├── examples.md
└── anti-patterns.md
NIET toegestaan in skill folders:
- README.md
- CHANGELOG.md
- Taal subfolders (NL/, EN/)
| Aspect | Vereiste |
|---|---|
| Frontmatter | name + description (verplicht) |
| Name format | kebab-case, max 64 chars |
| Description | Bevat triggers, max 1024 chars |
| Body | < 500 regels |
| Taal | Engels |
Level 1: Metadata (altijd geladen) ~100 woorden
Level 2: SKILL.md body (bij trigger) <500 regels
Level 3: References (on-demand) Onbeperkt
Vereiste project settings:
- Network: "Package managers only"
- Additional domains:
api.github.com,github.com - Nieuwe conversatie nodig na domain toevoegen
# 1. Token instellen
export GITHUB_TOKEN="..."
# 2. Bestand uploaden
CONTENT=$(base64 -w 0 bestand.md)
curl -X PUT -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/.../contents/path/bestand.md" \
-d '{"message":"...","content":"'$CONTENT'"}'
# 3. Bestand updaten (SHA nodig)
SHA=$(curl ... | grep sha | cut -d'"' -f4)
curl -X PUT ... -d '{"message":"...","content":"...","sha":"'$SHA'"}'Fase [nummer]: [actie] [onderwerp]
Voorbeelden:
- Fase 2.5: Add frappe-syntax-hooks skill
- Cleanup: Remove old NL/EN structure
- Fix: Correct SKILL.md frontmatter
Ontdekt tijdens mid-project review:
Onze oorspronkelijke structuur met NL/EN subfolders was NIET compatibel met Anthropic's package_skill.py:
# package_skill.py verwacht:
skill_md = skill_path / "SKILL.md" # DIRECT in root!Impact: Volledige herstructurering nodig.
Analyse van Anthropic's eigen skills:
- Geen enkele Anthropic skill is meertalig
- Skill instructies zijn voor Claude, niet voor gebruikers
- Claude kan Engelse instructies lezen en in elke taal antwoorden
Besluit: Nederlandse skills geschrapt → 56 skills → 28 skills (50% reductie)
Uit quick_validate.py:
| Veld | Vereiste | Max |
|---|---|---|
name |
kebab-case (a-z, 0-9, -) | 64 |
description |
String, geen < > | 1024 |
compatibility |
Optional | 500 |
| SKILL.md | In folder ROOT | - |
| ❌ Fout | ✅ Correct |
|---|---|
| NL/EN subfolders | Aparte skills per taal |
| SKILL.md in subfolder | SKILL.md in root |
| README.md in skill | Geen README in skill |
| Inconsistente naamgeving | Strict kebab-case |
| ❌ Fout | ✅ Correct |
|---|---|
| Direct beginnen met code | Research-first |
| Pas achteraf pushen | Push na elke fase |
| Geen validatie | quick_validate.py gebruiken |
| Handmatig packagen | package_skill.py gebruiken |
| ❌ Fout | ✅ Correct |
|---|---|
from frappe.utils import x |
frappe.utils.x() |
import json in Server Script |
frappe.parse_json() |
| Direct SQL zonder escaping | frappe.db.sql met parameters |
- ✅ Lees platform documentatie volledig (skill-creator/SKILL.md)
- ✅ Test tooling VOORDAT je structuur kiest
- ✅ Definieer directory structuur expliciet in masterplan
- ✅ Plan checkpoints na elke hoofdfase
- ✅ Research document eerst
- ✅ SKILL.md < 500 regels, details in references/
- ✅ Valideer met
quick_validate.py - ✅ Package met
package_skill.py - ✅ Push source + package naar GitHub
- ✅ Elke fase eindigt met push
- ✅ ROADMAP.md is altijd actueel
- ✅ Lessons learned continu documenteren
- ✅ Verificatie na migraties/herstructurering
Geleerd uit: Meerdere sessie-onderbrekingen door crashes/disconnects.
Claude's filesystem reset tussen sessies. Bij een onderbroken sessie:
- Sommige bestanden zijn wel gepusht naar GitHub
- Andere bestanden zijn verloren
- Context over voortgang is weg
Bij elke sessie die een vervolg zou kunnen zijn:
-
Scan GitHub state EERST
# Check recente commits curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ ".../commits?per_page=5" # Check specifieke directories curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ ".../contents/skills/source/[category]"
-
Check ROADMAP.md changelog
- Laatste entry datum
- Laatst voltooide fase/stap
- Genoemde bestanden
-
Identificeer onderbrekingspunt
- Vergelijk ROADMAP met actual files
- Wat bestaat wel/niet in repo?
-
Vraag bevestiging VOORDAT je verdergaat
"Ik zie dat fase X.Y gedeeltelijk voltooid is. De volgende bestanden zijn al gepusht: [lijst] De volgende ontbreken: [lijst] Zal ik verdergaan vanaf [specifieke stap]?"
- Push elk bestand direct na creatie
- Update ROADMAP.md na elke significante stap
- Atomic commits (één logische wijziging per commit)
"GitHub is de source of truth. ALTIJD repo state scannen voordat je aanneemt dat je opnieuw moet beginnen."
Geleerd uit: Verwarring door dubbele tracking in Claude Project Instructies én ROADMAP.md
Status tracking op meerdere plekken:
- Claude Project Instructies zeiden "Fase 2.10, 38%"
- ROADMAP.md zei "Fase 4, 46%"
- Welke is correct? → Verwarring en tijdverlies
ROADMAP.md is de ENIGE plek voor status tracking.
| Document | Bevat | Bevat NIET |
|---|---|---|
| Claude Project Instructies | HOW to work | WHERE we are |
| ROADMAP.md | Current status, progress, changelog | Methodology |
| WAY_OF_WORK.md | Methodology, workflows | Status |
-
Nooit status hardcoden in instructies
- Instructies verwijzen naar ROADMAP
- Status is altijd actueel via GitHub
-
ROADMAP update is VERPLICHT na elke fase
- Changelog entry met datum
- Status tabel updaten
- "Volgende Stappen" bijwerken
-
Session start: ROADMAP eerst ophalen
- Check laatste changelog entry
- Bevestig huidige fase
- Dan pas verdergaan
"Als ROADMAP niet bijgewerkt is, weet de volgende sessie niet waar we gebleven zijn."
| # | Les |
|---|---|
| 1 | Test platform tooling VOORDAT je structuur kiest |
| 2 | Server Scripts: GEEN imports, alles via frappe namespace |
| 3 | Research-first: documenteer voordat je bouwt |
| 4 | Push na ELKE fase - Claude's filesystem reset |
| 5 | SKILL.md moet DIRECT in skill folder root staan |
| 6 | Engels-only is Anthropic best practice |
| 7 | Eén source of truth voor status (ROADMAP.md) |
| 8 | Split grote fases proactief (>700 regels research) |
| 9 | Valideer altijd met officiële tooling |
| 10 | Scan GitHub EERST bij sessie-hervatting |
Geleerd uit: Fase 7 "PROJECT COMPLEET" → Fase 8 reflectie toonde gaps
We verklaarden "100% compleet" terwijl:
- ✅ 28 skills structureel aanwezig
- ❌ 9 skills missen V16 frontmatter
- ❌ Geen systematische validatie met tooling uitgevoerd
- ❌ Geen functionele tests in Claude gedaan
- ❌ Skills nooit daadwerkelijk gebruikt voor code generatie
┌─────────────────────────────────────────────────────────────────────┐
│ NIVEAU VAN "COMPLEET" │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Level 1: Structureel Compleet │
│ • Alle bestanden bestaan │
│ • Correcte directory structuur │
│ • Frontmatter aanwezig │
│ → Dit hadden we ✅ │
│ │
│ Level 2: Inhoudelijk Correct │
│ • Geen factual errors │
│ • Versie markers consistent │
│ • Alle features gedocumenteerd │
│ → Dit dachten we, maar V16 gaps ⚠️ │
│ │
│ Level 3: Technisch Gevalideerd │
│ • quick_validate.py passed │
│ • package_skill.py succesvol │
│ • .skill bestanden gegenereerd │
│ → Dit niet gedaan ❌ │
│ │
│ Level 4: Functioneel Getest │
│ • Skills laden in Claude │
│ • Triggers activeren correct │
│ • Code generatie werkt │
│ → Dit niet gedaan ❌ │
│ │
│ Level 5: Productie Bewezen │
│ • Echte ERPNext projecten │
│ • User feedback verwerkt │
│ • Edge cases getest │
│ → Toekomst │
│ │
└─────────────────────────────────────────────────────────────────────┘
"We hebben het gemaakt" ≠ "Het werkt"
Structurele completeness is een milestone, niet de finish line. Zonder validatie en testing is "compleet" een aanname.
-
Definieer "done" expliciet per fase
- Welk niveau van compleet is vereist?
- Wat zijn de exit criteria?
-
Bouw validatie in de workflow
- Niet als laatste stap
- Na elke skill, niet na alle skills
-
Plan functionele tests vanaf begin
- Niet "als we tijd hebben"
- Als onderdeel van de definitie van done
"100% structureel compleet kan nog steeds 0% functioneel getest zijn. Wees expliciet over welk niveau je claimt."
Geleerd uit: ERPNext V16 release tijdens projectontwikkeling
- Project gestart met scope: V14 + V15
- ERPNext V16 released tijdens ontwikkeling
- Besluit: V16 alsnog toevoegen aan scope
- Resultaat: Retrofit nodig in reeds "voltooide" skills
V16 toevoegen achteraf betekende:
- Opnieuw door alle skills gaan
- Sommige skills al "afgevinkt" in ROADMAP
- Inconsistente V16 coverage (sommige wel, sommige niet)
- 9 skills met ontbrekende V16 vermelding ontdekt in audit
| Aspect | Retrofit | Vanaf Begin |
|---|---|---|
| Tijdsinvestering | Hoog (dubbel werk) | Normaal |
| Consistentie | Risico op gaps | Uniform |
| Motivatie | Laag ("was al klaar") | Hoog (onderdeel van werk) |
| Fouten | Meer kans | Minder kans |
-
Versie scope lock bij start
- Expliciete beslissing: "V14+V15 only, V16 is v2.0"
- Of: wacht tot V16 stabiel is
-
Versie-agnostisch ontwerpen
- Frontmatter:
frappe_versions: [14, 15, 16+] - Content: "Version Differences" tabel standaard
- Frontmatter:
-
Monitoring van releases
- Frappe release calendar volgen
- Scope beslissing herzien bij major release
"Versie scope wijzigen mid-project is technische schuld. Beter: expliciet scopen of versie-agnostisch ontwerpen."
Geleerd uit: Fase 8 reflectie - skills nooit daadwerkelijk getest
Geen enkele skill is:
- ✅ Structureel gevalideerd met
quick_validate.py - ✅ Gepackaged met
package_skill.py - ❌ Geladen in Claude om te zien of trigger werkt
- ❌ Gebruikt om ERPNext code te genereren
- ❌ Getest op edge cases (bijv. V16-specifieke code)
-
Niet in masterplan
- Fase 7 was "Finalisatie" → docs, cleanup
- Geen "Testing" fase gepland
-
Aanname van correctheid
- "Research was grondig"
- "Voorbeelden komen uit officiële docs"
- "Dus het zal wel werken"
-
Tijd/scope druk
- 28 skills is veel
- Focus op "af krijgen"
- Testing voelt als "extra"
┌─────────────────────────────────────────────────────────────────────┐
│ SKILL TEST WORKFLOW │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ LEVEL 1: Structurele Validatie (per skill) │
│ □ python quick_validate.py [skill-folder] │
│ □ Output: "Skill is valid!" of errors │
│ │
│ LEVEL 2: Package Generatie (per skill) │
│ □ python package_skill.py [skill-folder] output/ │
│ □ Output: [skill-name].skill bestand │
│ │
│ LEVEL 3: Loading Test (per skill) │
│ □ Upload skill naar Claude Project │
│ □ Vraag: "Welke skills heb je geladen?" │
│ □ Verifieer: skill naam + beschrijving correct │
│ │
│ LEVEL 4: Trigger Test (per skill) │
│ □ Gebruik een trigger phrase uit de description │
│ □ Verifieer: Claude activeert skill content │
│ │
│ LEVEL 5: Functionele Test (per skill type) │
│ □ Syntax skill: "Genereer een [X] voor ERPNext" │
│ □ Impl skill: "Help me [workflow] implementeren" │
│ □ Error skill: "Ik krijg deze error: [X]" │
│ □ Agent: End-to-end code interpretatie/validatie │
│ │
│ LEVEL 6: Edge Case Test │
│ □ V16-specifieke code request │
│ □ Anti-pattern scenario (moet waarschuwen) │
│ □ Ambigue vraag (moet juiste skill kiezen) │
│ │
└─────────────────────────────────────────────────────────────────────┘
Als tijd beperkt is, minimaal:
- Alle skills: Level 1 + 2 (tooling validatie)
- Sample per categorie: Level 3-5 (1 syntax, 1 impl, 1 error, 1 agent)
- Kritieke skills: Level 6 (server-scripts vanwege sandbox issue)
"Een skill zonder test is een aanname. Plan testing als onderdeel van development, niet als afterthought."
Geleerd uit: 40+ gesprekken met intensief GitHub API gebruik
# ALTIJD SHA eerst ophalen bij file updates
SHA=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
"https://api.github.com/repos/.../contents/path/file.md" \
| grep '"sha"' | head -1 | cut -d'"' -f4)
# Dan pas update met SHA
curl -X PUT ... -d '{"message":"...","content":"...","sha":"'$SHA'"}'Waarom: Zonder SHA krijg je conflict errors bij bestaande bestanden.
# ALTIJD -w 0 gebruiken voor line wrapping te voorkomen
CONTENT=$(base64 -w 0 bestand.md)Waarom: Zonder -w 0 bevat de base64 output newlines die JSON breken.
# Voor leesbare content (geen JSON wrapper)
curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.raw" \
"https://api.github.com/.../contents/path"Waarom: Geeft direct markdown/text content i.p.v. base64-encoded JSON.
| Scenario | Aanpak |
|---|---|
| <5 bestanden | Direct via API per file |
| 5-20 bestanden | Download lokaal → valideer → batch upload |
| >20 bestanden | Download alles → lokale processing → staged commits |
"GitHub API is reliable maar stateful. SHA management en encoding zijn de #1 failure points."
Geleerd uit: Fase 8.3 validatie - 18 skills hadden parsing issues
18 van 28 skills faalden initiële validatie vanwege YAML frontmatter issues:
# ❌ FOUT - "Triggers:" wordt geïnterpreteerd als YAML mapping
description: Syntax skill for Client Scripts. Triggers: help with ERPNext
# ✅ CORRECT - Quoted string voorkomt YAML parsing
description: "Syntax skill for Client Scripts. Triggers: help with ERPNext"
# ✅ ALTERNATIEF - Folded scalar voor lange descriptions
description: >
Syntax skill for Client Scripts. Triggers: help with ERPNext
client-side form interactions, validation, and server calls.| Issue | Symptoom | Oplossing |
|---|---|---|
| Colon in value | mapping values not allowed |
Quote de hele string |
| Multi-line | Truncated content | Gebruik > of | |
| Special chars | Parse errors | Quote + escape |
| Embedded quotes | Nesting errors | Use opposite quote type |
"YAML is subtiel. Elke description met ':' of andere special characters MOET gequoted worden."
Geleerd uit: Sessie 22 - mid-sessie overflow na grote validatie operatie
- Scan GitHub state - Check recente commits en vergelijk met verwachte bestanden
- Check ROADMAP.md - Laatste changelog entry, komt status overeen?
- Identificeer gaps - Welke bestanden zijn verloren?
- Communiceer en hervat - "Status: X gepusht, Y ontbreekt"
- Push incrementeel (na elk bestand)
- Monitor output bij grote operaties
- Checkpoint commits tussentijds
- Max 5-10 files per conversatie-segment
"Context overflow is onvermijdelijk bij grote operaties. Plan voor recovery, push vroeg en vaak."
Geleerd uit: Fase 7 - ontdekking van agentskills.io standaard
| Aspect | Agent Skills | Claude Agent SDK |
|---|---|---|
| Type | Instructie-gebaseerd | Programmatisch |
| Format | YAML + Markdown | Python/TypeScript |
| Doel | Claude capability extension | Autonomous agent building |
| Website | agentskills.io | docs.anthropic.com/sdk |
| Ons package | ✅ Agent Skills | ❌ Niet van toepassing |
"Ken het ecosysteem. 'Agent Skills' (instructies voor Claude) ≠ 'Agent SDK' (code om agents te bouwen)."
Geleerd uit: Fase 8.8 planning - gap analyse tegen GitHub best practices
GitHub meet repository "community health" op 7 criteria:
| File | Doel | Ons |
|---|---|---|
| README.md | Project overview | ✅ |
| LICENSE | Legal terms | ✅ |
| CODE_OF_CONDUCT.md | Community behavior | ⏳ |
| CONTRIBUTING.md | How to contribute | ⏳ |
| SECURITY.md | Vulnerability reporting | ⏳ |
| Issue templates | Structured bug reports | ⏳ |
| PR template | Structured contributions | ⏳ |
Score: 2/7 → 7/7 (Doel na Fase 8.8)
"Open source is meer dan code. Community health files zijn essentieel voor professionele repositories."
Geleerd uit: Fase 8.3 - batch validatie van 28 skills
| Issue Type | Aantal | Root Cause |
|---|---|---|
| YAML quoting | 18 | Unquoted colons in descriptions |
| Line limit exceeded | 3 | Content niet in references verplaatst |
- Bulk Download - Alle skills lokaal
- Batch Validation -
quick_validate.pyop alles - Pattern-Based Fixing - Sed/grep voor bulk fixes
- Re-validate - Tot 0 errors
- Batch Upload - Alles in één sessie
"Bulk lokaal verwerken is 3x sneller dan per-file API operaties."
Geleerd uit: 40+ gesprekken met dezelfde toolset
| Task | Tools | Sequence |
|---|---|---|
| File update | bash → view → str_replace → bash | Check → Read → Edit → Verify |
| Multi-file create | create_file (loop) → present_files | Create batch → Present once |
| GitHub push | bash (encode) → bash (PUT) | Encode → Upload |
"Tool mastery komt van patronen herkennen. De beste workflows combineren tools in vaste sequences."
| # | Les |
|---|---|
| 1 | Test platform tooling VOORDAT je structuur kiest |
| 2 | Server Scripts: GEEN imports, alles via frappe namespace |
| 3 | Research-first: documenteer voordat je bouwt |
| 4 | Push na ELKE fase - Claude's filesystem reset |
| 5 | SKILL.md moet DIRECT in skill folder root staan |
| 6 | Engels-only is Anthropic best practice |
| 7 | Eén source of truth voor status (ROADMAP.md) |
| 8 | Split grote fases proactief (>700 regels research) |
| 9 | Valideer altijd met officiële tooling |
| 10 | Scan GitHub EERST bij sessie-hervatting |
| 11 | "Structureel compleet" ≠ "Functioneel getest" |
| 12 | Versie scope wijzigen mid-project = technische schuld |
| 13 | Plan testing als onderdeel van development |
| 14 | Definieer "done" expliciet met levels |
| 15 | GitHub API workflow > proprietary formats |
| 16 | SHA management en base64 encoding zijn GitHub API failure points |
| 17 | YAML descriptions met ':' MOETEN gequoted worden |
| 18 | Plan voor context overflow: push incrementeel |
| 19 | Agent Skills ≠ Agent SDK - ken het verschil |
| 20 | Community health files essentieel voor open source |
| 21 | Bulk lokaal verwerken is 3x sneller dan per-file API |
| 22 | Tool mastery = patroonherkenning + vaste sequences |
| Datum | Wijziging |
|---|---|
| 2026-01-18 | Sectie 15-21 toegevoegd: Sessie 24 chat analyse (40+ gesprekken) |
| 2026-01-18 | Top 15 → Top 22 uitgebreid |
| 2026-01-18 | Sectie 12-14 toegevoegd: Post-release reflecties |
| 2026-01-18 | Sectie 10 toegevoegd: Single Source of Truth voor tracking |
| 2026-01-18 | Sectie 9 toegevoegd: Session Recovery Protocol |
| 2026-01-17 | Volledige herschrijving na mid-project review |
| 2026-01-17 | Engels-only beslissing gedocumenteerd |
| 2026-01-17 | Anthropic tooling compatibiliteit toegevoegd |
| 2026-01-17 | Cleanup van duplicaat secties |
Dit document wordt continu bijgewerkt met nieuwe inzichten.