Marktplaats publisher: veilige gratis plaatsing met harde SEO/copy-QA gate.
---
name: "marktplaats"
description: "Marktplaats publisher: veilige gratis plaatsing met harde SEO/copy-QA gate."
homepage: https://www.marktplaats.nl
metadata: {"clawdbot":{"emoji":"🇳🇱","requires":{"bins":["node"]}}}
---
# Marktplaats verkoopassistent: deterministic, SEO rond 3500 tekens, copy-QA verplicht
## Publicatie En Platformscope
- Zoek- en categoriecommands zijn cross-platform en vereisen Node.js 18+.
- De volledige plaatsings- en bewerkworkflow is op dit moment macOS/Safari-gebaseerd, omdat de probe-helper Safari via AppleScript gebruikt als ingelogde browsercontext.
- Safari wordt gebruikt als sessiedrager; cookies, sessietokens en XSRF/auth-waarden mogen niet worden geëxporteerd of gelogd.
- Niet-macOS omgevingen kunnen de zoek/category CLI, copy-QA CLI en procedurele instructies gebruiken, maar hebben voor publiceren/bewerken een eigen browser-session adapter nodig.
- Chrome-ondersteuning is conceptueel mogelijk, maar deze publicatie bevat nu een Safari-gebaseerde helper.
## Doel
Gebruik deze skill voor Marktplaats-advertenties: voorbereiden, categorie/formulier inspecteren, foto's uploaden, plaatsen, bewerken, controleren en lokaal registreren.
Belangrijk uitgangspunt: werk background-first, sessie-veilig en bewijsbaar. Vermijd storende foreground-browserbediening. Gebruik Safari/Chrome alleen als sessiebron of geïsoleerde automation-context wanneer HTTP/browser-fetch niet genoeg is.
> Commentaar: bestuur niet zomaar de actieve browser van de gebruiker. De juiste volgorde is: eerst lokaal voorbereiden en valideren, daarna API/scrape/browser-context, pas daarna een geïsoleerde browser-tab als het echt moet.
## Werkingsgebied
Deze skill is bedoeld voor normale, lage-volume Marktplaats-verkoop:
- Een enkele advertentie voorbereiden, plaatsen, bewerken of controleren.
- Kladtekst omzetten naar een nette, feitelijke en SEO-rijke advertentietekst.
- Categorieën en formulierstatus actueel bepalen via scraping/API/browser-context in plaats van oude vaste category-id's.
- Foto's uploaden en pas als geslaagd beschouwen wanneer form state en zichtbare teller kloppen.
- Werken met een al ingelogde Marktplaats-sessie zonder cookies of tokens te exporteren.
- Lokale privéregistratie bijhouden van concept, prijs, foto's, status, live URL, copy-QA en verificatie.
Niet bedoeld voor:
- Bulkposten, professionele campagnevoering of automatisch doorplaatsen van veel advertenties.
- Omzeilen van login, captcha, MFA, WAF, anti-bot of andere beveiligingsmechanismen.
- Stil selecteren van betaalde promoties, betaalde bundels, urgent/topadvertentie/homepage-opties of upsells.
- Doorzetten wanneer Marktplaats voor de categorie of accountstatus geen gratis route aanbiedt.
- Verkoop van gereguleerde, risicovolle of policy-gevoelige goederen zonder aparte menselijke check.
- Veronderstellen dat Marktplaats een stabiele API heeft; UI, React-state, categorieën en validatie kunnen wijzigen.
> Commentaar: behandel deze skill als een veilige verkoopassistent voor normale advertenties, niet als algemene Marktplaats-bot.
## Kernregels
- Publiceer of wijzig alleen na expliciete opdracht voor die specifieke advertentie.
- Geen betaalde opties zonder expliciet akkoord.
- Geen cookies, sessietokens, XSRF-tokens of auth-waarden tonen of loggen.
- Geen captcha, login, WAF of beveiligingsstap omzeilen.
- Stop bij betaalflow, captcha, login challenge of onduidelijke verplichte velden.
- Publiceer of wijzig nooit zolang de omschrijving niet door de Copy Quality Gate is gekomen.
- UI-problemen, foto-uploadproblemen of tijdsdruk zijn geen reden om de Copy Quality Gate over te slaan.
- Houd lokale administratie bij in `~/Documents/OpenClaw/Data/marktplaats/advertenties.json` en per-advertentiemap.
- Houd skill- en publicatiebestanden vrij van persoonsnamen, lokale klantcases, advertentie-id's, tokens en privébestanden.
> Commentaar: sessiegebruik mag, sessie-extractie/logging niet. Gebruik een ingelogde browsercontext alleen als veilige uitvoeromgeving; print nooit auth-data.
## Gratis Advertentie Focus
Standaard is de workflow gericht op gratis of nul-euro advertenties:
- Kies de gratis/basic advertentievorm wanneer Marktplaats die aanbiedt.
- Controleer vóór submit dat betaalde opties uit staan en dat het totaalbedrag nul of duidelijk niet-betaald is.
- Stop als Marktplaats naar betaling, promotie-upsell, niet-nul totaal of verplichte betaalroute gaat.
- Betaalde opties mogen alleen wanneer de gebruiker die optie expliciet voor die specifieke advertentie vraagt.
- Forceer geen workaround als een categorie of accountstatus geen gratis route toont.
> Commentaar: “gratis route niet gevonden” is een stopconditie, geen reden om blind een betaalde flow te accepteren.
## Werkwijze In Het Kort
1. Bereid lokaal titel, omschrijving, prijs, conditie, levering/ophalen, categorie-kandidaten en fotolijst voor.
2. Zoek bij merk/model betrouwbare publieke productinformatie op en verwerk die feitelijk.
3. Schrijf een volledige SEO-omschrijving van circa 3200-3500 tekens en laat die verplicht slagen voor de Copy Quality Gate.
4. Leg het copy-QA-resultaat vast in `ad.json` voordat Marktplaats wordt ingevuld.
5. Probe actuele categorieën en form state background-first.
6. Gebruik Safari alleen als ingelogde sessiedrager wanneer dat nodig is.
7. Vul echte React/formuliervelden en upload foto's via de echte uploader-flow.
8. Controleer gratis/basic bundle, fototeller, titel, prijs, conditie en beschrijving vóór submit.
9. Publiceer of wijzig pas na expliciete opdracht voor die advertentie.
10. Verifieer de live advertentiepagina en werk het lokale register bij.
> Commentaar: elke stap moet bewijs opleveren. Een submit zonder copy-QA en live verificatie is niet “klaar”.
## Omschrijving En SEO
Voor Marktplaats-advertenties moet de omschrijving standaard rijk en SEO-geoptimaliseerd zijn, maar rond/onder 3500 tekens blijven.
- Richtwaarde: circa 3200-3500 tekens.
- Absolute ondergrens: 2800 tekens. Onder 2800 is een stopconditie, tenzij de gebruiker expliciet een korte advertentie vraagt of veilig uitbreiden onmogelijk is.
- Absolute bovengrens: 3600 tekens, tenzij de live Marktplaats-editor aantoonbaar meer accepteert en de laatste zin na submit zichtbaar blijft.
- Als de gebruiker om 2000 woorden vraagt, interpreteer dat als: inhoudelijk rijk, SEO-breed en goed aangevuld. Forceer geen 2000 woorden wanneer Marktplaats het veld praktisch afkapt.
- Controleer vóór submit altijd `description_nl-NL.length` en of het einde van de tekst aanwezig is.
- Controleer na submit live op de advertentiepagina of de nieuwe tekst zichtbaar is.
- Houd tekst ASCII-safe wanneer browser-encoding of live rendering mojibake liet zien.
> Commentaar: de praktische regel is niet “zoveel mogelijk woorden”, maar “maximaal nuttige SEO binnen wat Marktplaats zichtbaar accepteert”. Circa 3.5k tekens werkt betrouwbaarder dan extreem lange teksten.
SEO-werkwijze:
1. Gebruik de kladtekst als basis, maar herschrijf zelf naar een nette advertentietekst.
2. Zoek productinformatie online bij fabrikant, handleiding of betrouwbare bron zodra merk/model bekend zijn.
3. Vermeld gecontroleerde specificaties feitelijk en conservatief.
4. Vermeld niet zomaar dat alle schroeven, pluggen, adapters of accessoires compleet zijn als dat niet zichtbaar of bevestigd is.
5. Gebruik natuurlijke zoekvarianten, synoniemen en enkele veelgebruikte schrijfvarianten/spelfouten, maar geen platte keywordspam.
6. Bouw de tekst scanbaar op met korte kopjes of alinea's.
7. Voeg geen meta-tekst toe die uitlegt dat de beschrijving SEO-gericht is; die uitleg hoort niet in de advertentie.
8. Gebruik alleen kleine, natuurlijke zoekvarianten; geen onzin, rare symbolen of copy/paste-spam.
> Commentaar: SEO-varianten moeten klinken alsof een mens het advertentieveld slim invult, niet alsof er onderaan een spamwoordenlijst staat.
## Copy Quality Gate
Deze gate is verplicht voor elke nieuwe plaatsing en elke inhoudelijke bewerking van een advertentieomschrijving.
Een tekst is publiceerbaar als alle harde checks slagen:
- Lengte: standaard 3200-3500 tekens, inclusief spaties en nieuwe regels.
- Absolute ondergrens: 2800 tekens.
- Absolute bovengrens: 3600 tekens, tenzij live aantoonbaar veilig.
- Structuur: minimaal 7 substantiële alinea's of secties.
- Inhoud: bevat intro, staat/conditie, zichtbare of gecontroleerde kenmerken, toepassing/use-cases, compatibiliteit/waarop letten, ophalen/verzenden, prijs/bieden en natuurlijke vindbaarheid.
- SEO: zoekvarianten zijn natuurlijk verwerkt in lopende tekst.
- Verboden: geen regel of kopje `Zoektermen:`, `Keywords:`, `SEO:` of vergelijkbare spamachtige lijst.
- Verboden: geen lange komma-gescheiden keyworddump.
- Spelfout/variant: neem 1-3 kleine natuurlijke zoekvarianten of veelgemaakte schrijfwijzen op, bijvoorbeeld `deur slot`, `buiten antenne`, `vessa`, of een productrelevante variant. Doe dit subtiel in een zin, niet als lijst met fouten.
- Feitelijkheid: geen onbevestigde claims over complete sets, werkende staat, garantie, exacte specificaties of accessoires.
- Laatste-zin-check: de laatste zin moet ook in het Marktplaats-formulier en live advertentie zichtbaar zijn.
Als een harde check faalt:
1. Niet publiceren of opslaan.
2. Tekst herschrijven tot de gate slaagt.
3. Alleen afwijken als de gebruiker expliciet akkoord geeft op de afwijking.
4. Leg de afwijking vast in `ad.json.notes`.
### Verplichte CLI-Check
Gebruik vóór invullen/publiceren altijd:
```bash
marktplaats-copy-qa ./description.md \
--require "<merk-of-type>" \
--require "<productsoort>" \
--variant "<natuurlijke zoekvariant>" \
--ad-json ./ad.json
```
Regels:
- Geef minimaal twee `--require` termen mee, bijvoorbeeld merk/model en productsoort.
- Geef minimaal één `--variant` mee, bijvoorbeeld een natuurlijke schrijfwijze die kopers ook gebruiken.
- Gebruik `--allow-no-variant` alleen met expliciete gebruikersafwijking of wanneer een variant feitelijk onzinnig is.
- Een exitcode anders dan `0` is een stopconditie.
- Als `ad.json.copyQuality.passed` niet `true` is, mag de advertentie niet worden gepubliceerd.
- Na live submit moet `copyQuality.lastSentenceVerified` of `ad.json.notes` worden bijgewerkt met live verificatie.
Voor debugging:
```bash
marktplaats-copy-qa ./description.md --json
marktplaats-copy-qa --self-test
```
### Standaard Tekstopbouw
Gebruik deze opbouw als default, tenzij het product daar niet bij past:
1. Open met merk, model/type en kernfunctie in natuurlijke taal.
2. Beschrijf wat het item is en voor wie het bedoeld is.
3. Beschrijf staat, zichtbare gebruikssporen en wat wel/niet getest is.
4. Noem concrete kenmerken, afmetingen, aansluitingen, meegeleverde delen of zichtbare markeringen.
5. Leg toepassingen uit: vervanging, uitbreiding, reserveonderdeel, hobbyproject, router/modem/deur/toepassing enzovoort.
6. Leg uit waar koper op moet letten: modelvergelijking, aansluitingen, montage, foto's controleren, eigen situatie nameten.
7. Verwerk synoniemen en zoekvarianten in normale zinnen.
8. Gebruik hooguit 1-3 kleine natuurlijke spelfout-/schrijfvarianten in context.
9. Sluit af met prijs, bieden, ophalen/verzenden en korte call-to-action.
Gebruik geen expliciete `Zoektermen:`-footer. De vindbaarheid moet in de advertentietekst zelf zitten.
## Background-first Volgorde
Gebruik deze volgorde voor plaatsing en bewerking:
1. **Local preparation**
- Maak titel, omschrijving, prijs/conditie/levering en fotolijst lokaal klaar.
- Schrijf/werk lokale bestanden bij onder `~/Documents/OpenClaw/Data/marktplaats/<slug>/`.
- Draai de Copy Quality Gate en leg resultaat vast in `ad.json`.
> Commentaar: lokaal voorbereiden is goedkoop, stil en veilig. Pas als de advertentie inhoudelijk klaar is, Marktplaats aanraken.
2. **HTTP/browser-fetch probe zonder foreground**
- Gebruik waar mogelijk een fetch/XHR vanuit bestaande ingelogde browsercontext, zonder cookies te exporteren.
- Gebruik normale Safari- of Chrome-user-agent voor gewone HTTP-probes.
- Doel: form action, categorievelden, bestaande image ids/urls, beschrijving, prijs en edit/place status inspecteren.
- Browsercontext-fetch mag dezelfde sessie gebruiken, maar mag cookies/tokens niet printen.
> Commentaar: dit is de voorkeursroute. Als server HTML leeg is maar browser-fetch authenticated werkt, gebruik die sessie als transportlaag zonder UI te kapen.
3. **Geïsoleerde tab alleen indien nodig**
- Als DOM/React-flow nodig is, open of gebruik een dedicated Marktplaats-tab/window.
- Gebruik maximaal één Marktplaats-tab per advertentieflow, tenzij de site technische rollback of herstel echt vereist.
- Bewaar vooraf de huidige actieve window/tab en herstel die na afloop waar mogelijk.
- Selecteer tabs op URL/ad-id, niet op aanname van `front document`.
- Minimaliseer `activate`, System Events, keypresses en visuele foreground-wissels.
- Gebruik geen coördinaatklikken.
- Open geen extra vensters, extra testschermen of losse hulpschermen tenzij een foutklasse dit expliciet vereist.
> Commentaar: meerdere tabs kunnen door elkaar lopen. Maak altijd eerst een tab-inventaris en match exact op advertentie-id of edit-URL.
4. **DOM-event automation, geen handmatige UI**
- Vul inputs via DOM en echte `input`/`change` events.
- Gebruik de echte Marktplaats React-flow waar nodig, vooral voor rich-text editor, foto-uploader en bundle/radio-keuzes.
- Klik knoppen via DOM-event op basis van tekst/selector, niet via schermcoördinaten.
- Houd de flow lineair: ene stap afmaken, verifiëren, dan de volgende stap. Geen parallelle UI-acties.
> Commentaar: hidden fields direct zetten kan soms lijken te werken, maar React-validatie kan het negeren. Bij rijke editor: editor zelf vullen én hidden field controleren.
5. **Foto-rotatie indien nodig**
- Controleer per foto of de oriëntatie logisch is voordat je uploadt of vóór definitieve submit.
- Roteer foto’s alleen wanneer de preview of metadata laat zien dat het nodig is.
- Gebruik dezelfde bronbestanden, maar pas lokaal of in de uploadstroom een rotatie toe als de foto anders verkeerd staat.
- Verifieer na upload dat de beelden in de juiste stand in de uploader/preview staan.
- Draai niet blind alle foto’s; draai alleen wanneer nodig.
> Commentaar: de standaard is “alleen roteren als nodig”. Niet gokken, maar preview/oriëntatie controleren.
6. **Live verificatie**
- Controleer na submit de live advertentiepagina.
- Verifieer titel, omschrijving, prijs, foto-aantal, status, laatste zin en geen betaalde opties.
- Werk lokaal register bij.
> Commentaar: “submit gelukt” telt pas als live advertentiepagina de nieuwe inhoud toont. Vooral controleren op laatste SEO-zin, prijs en foto-aantal.
## Self-healing Protocol
Gebruik self-healing bij normale technische breuken, maar niet bij security-, captcha-, betaal- of login-uitdagingen die menselijke actie vereisen.
Self-healing betekent hier:
1. Fout classificeren.
2. Bewijs verzamelen zonder gevoelige data te loggen.
3. Gerichte herstelpoging doen.
4. Opnieuw verifiëren.
5. Maximaal 2-3 herstelpogingen per foutklasse.
6. Stoppen en helder rapporteren als herstel onzeker of risicovol wordt.
> Commentaar: self-healing is geen vrijbrief om blind door te drukken. Het is een gecontroleerde diagnose- en herstel-ladder.
### Foutklasse: Copy Quality Gate faalt
Signalen:
- `marktplaats-copy-qa` geeft exitcode `1` of `2`.
- `ad.json.copyQuality.passed` is niet `true`.
- De tekst is onder 2800 tekens of mist producttermen/variant.
- De tekst bevat `Zoektermen:`, `Keywords:`, `SEO:` of een keyworddump.
Herstel:
1. Stop alle Marktplaats UI-acties.
2. Herschrijf de tekst naar 3200-3500 tekens met natuurlijke SEO.
3. Voeg feitelijke productcontext toe: staat, toepassing, compatibiliteit, zichtbare kenmerken, ophalen/verzenden en waarop letten.
4. Verwerk 1-3 subtiele zoekvarianten in lopende tekst.
5. Draai `marktplaats-copy-qa` opnieuw.
Stopconditie:
- De tekst blijft falen of er is onvoldoende feitelijke informatie om veilig uit te breiden.
### Foutklasse: uitgelogd of sessie verlopen
Signalen:
- Redirect naar loginpagina.
- HTTP 401/403 bij browser-fetch.
- Plaats/editpagina toont geen formulier maar login/consent/security tekst.
- Marktplaats-accountnaam ontbreekt waar die normaal zichtbaar is.
Herstel:
1. Probe opnieuw via browser-context-fetch om tijdelijke redirect uit te sluiten.
2. Controleer of er een bestaande ingelogde Marktplaats-tab is.
3. Als niet ingelogd: stop en vraag gebruiker om in te loggen. Geen wachtwoorden invullen of login omzeilen.
4. Als gebruiker inlogt: hervat vanaf probe, niet vanaf half-ingevuld formulier.
Stopconditie:
- Captcha, MFA, login challenge of security prompt: stoppen en rapporteren.
### Foutklasse: categorieën of categorie-id's gewijzigd
Signalen:
- Oude `l1`, `l2`, `bucket` ontbreekt of geeft fout.
- Plaatsingspagina redirect naar categoriekeuze.
- Form action bestaat, maar categorie-specifieke velden ontbreken.
- Categorie-naam wijkt af van verwacht producttype.
Herstel:
1. Zoek categorie opnieuw via Marktplaats-categoriebronnen of vergelijkbare advertenties.
2. Open/probe de actuele categorie-plaatsingspagina.
3. Gebruik actuele `l1`, `l2`, `bucket`, category full name en form fields als bron van waarheid.
4. Als meerdere categorieën plausibel zijn, kies conservatief en motiveer kort; vraag alleen als het verkooprisico reëel is.
Stopconditie:
- Geen passende categorie met vertrouwen te bepalen of categorie vereist betaald/zakelijk pad.
### Foutklasse: veldnamen/formulierstructuur gewijzigd
Signalen:
- Bekende selectors ontbreken: `description_nl-NL`, `price.value`, `images.ids`, `selectedBundle`, etc.
- React-componenten renderen anders dan verwacht.
- FormData mist verplichte waarden ondanks DOM-set.
Herstel:
1. Maak een formulier-snapshot: alle `input`, `textarea`, `select`, `button`, `contenteditable`, labels en foutteksten.
2. Zoek op labels/tekst in plaats van alleen oude names/selectors.
3. Bouw een nieuwe field-map: label -> input name/type/options/current value.
4. Vul via native value setter + `input`/`change` events.
5. Verifieer met `new FormData(form)` en zichtbare foutteksten.
Stopconditie:
- Verplicht veld blijft onbekend of lijkt juridisch/betalingsgerelateerd.
### Foutklasse: rich-text omschrijving werkt niet
Signalen:
- Hidden `description_nl-NL` wijzigt, maar live tekst blijft oud.
- Contenteditable editor toont oude tekst.
- Tekst wordt afgekapt of laatste SEO-zin ontbreekt.
Herstel:
1. Controleer eerst dat de tekst lokaal door Copy Quality Gate komt.
2. Vul de contenteditable editor via selectie + echte insert/input events.
3. Zet hidden `description_nl-NL` alleen als fallback.
4. Controleer vóór opslaan hidden field én waar mogelijk editor-inhoud.
5. Controleer na opslaan live advertentiepagina.
6. Als tekst afkapt: compacter herschrijven; niet blijven forceren.
7. Bij afwijkende encoding: herschrijf naar ASCII-safe tekst totdat de live weergave schoon is.
Stopconditie:
- Nieuwe tekst verschijnt niet live na gecontroleerde update.
### Foutklasse: foto-upload faalt
Signalen:
- API geeft image id maar geen `images.urls`.
- Fototeller blijft `0 van 24` of lager dan verwacht.
- Upload endpoint geeft 400/413/415/500.
- Bestanden zijn te groot, verkeerd type of HEIC/metadata-probleem.
Herstel:
1. Controleer bestandspaden, bestandsgrootte en MIME/type.
2. Converteer of verklein kopieën waar nodig; bewaar originelen lokaal.
3. Gebruik echte Marktplaats file-input/React-uploader wanneer mogelijk.
4. Wacht op upload-completion en controleer:
- `images.ids`
- `images.urls`
- zichtbare fototeller
5. Retry per foto maximaal 2 keer.
6. Als API-upload wel werkt maar React niet: voer file-input-flow opnieuw uit, niet alleen hidden fields injecteren.
Stopconditie:
- Minder foto's gekoppeld dan bedoeld en gebruiker gaf geen toestemming om met minder foto's te plaatsen.
### Foutklasse: gratis advertentievorm/bundle niet geselecteerd
Signalen:
- Fouttekst zoals `Je hebt geen advertentievorm gekozen`.
- `selectedBundle` leeg.
- Gratis radio/card zichtbaar maar niet checked.
- Totaalbedrag niet `0,00`.
Herstel:
1. Selecteer echte gratis radio/card via DOM-event op label/input.
2. Controleer `bundle-selection=FREE` en `selectedBundle=FREE` indien aanwezig.
3. Controleer totaalbedrag.
4. Betaalde opties uitzetten: etalage, urgent, homepage, promoted, plus/premium.
Stopconditie:
- Gratis route is niet beschikbaar of Marktplaats stuurt naar betaling.
### Foutklasse: submit geeft validatiefouten
Signalen:
- Pagina blijft op place/edit-form.
- Foutteksten bij foto, beschrijving, prijs, conditie, bundle, postcode of levering.
- Geen redirect naar live advertentie.
Herstel:
1. Lees zichtbare foutteksten.
2. Map fouttekst naar veld.
3. Herstel alleen dat veld.
4. Verifieer FormData en zichtbare staat opnieuw.
5. Submit maximaal 2 keer na gerichte fixes.
Stopconditie:
- Fouttekst is onduidelijk of vereist keuze die de gebruiker moet maken.
### Foutklasse: browserautomation hangt of stoort foreground
Signalen:
- `do JavaScript` timeout.
- AppleScript/automation proces blijft hangen.
- Verkeerde tab/window actief.
- Browser komt naar voorgrond of blijft navigeren.
Herstel:
1. Stop nieuwe browseracties.
2. Inventariseer processen en tabs.
3. Kill alleen vastgelopen automation-processen, niet de browser zelf.
4. Herselecteer exacte Marktplaats-tab op URL/ad-id.
5. Als foreground stoort: terug naar background/browser-fetch of vraag gebruiker kort.
Stopconditie:
- Browserautomation blijft foreground verstoren en er is geen veilige background-route.
### Foutklasse: Marktplaats UI of bundels wijzigen onverwacht
Signalen:
- Nieuwe betaalopties verschijnen.
- Knoppen/labels zijn hernoemd.
- Formulier bevat extra verplichte velden.
- Preview/submit flow heeft extra tussenstap.
Herstel:
1. Snapshot de huidige UI/form labels.
2. Zoek gratis/standaard/0 euro route opnieuw.
3. Gebruik tekstlabels en prijs/totaal als bron van waarheid, niet oude selectors.
4. Stop als route juridisch/betalingsgerelateerd of onzeker wordt.
### Foutklasse: advertentie live maar register niet bijgewerkt
Signalen:
- Live URL bekend, maar `advertenties.json` mist record of oude status.
- Per-advertentie `ad.json` ontbreekt.
Herstel:
1. Lees live advertentiegegevens.
2. Werk centrale `advertenties.json` bij.
3. Maak/update per-advertentie `ad.json` en `description.md`.
4. Valideer JSON.
## Escalatie Naar Zwaardere Redeneermodus
Als een self-healing poging faalt door veranderde Marktplaats-structuur, onbekende React-flow, inconsistente form state of terugkerende copy-QA fouten:
1. Stop met submitten.
2. Maak een compacte technische snapshot zonder cookies/tokens.
3. Analyseer met de zwaarste beschikbare redeneermodus/modelconfiguratie in de omgeving.
4. Gebruik geen fictieve modelnaam als harde afhankelijkheid.
5. Als de omgeving later een zwaarder model/reasoningniveau aanbiedt, mag deze skill dat prefereren voor diagnose.
6. Rapporteer kort: foutklasse, bewijs, geprobeerd herstel, veilig vervolg.
## Nieuwe Advertentie Plaatsen
1. Maak een SEO-omschrijving van circa 3200-3500 tekens.
2. Zoek productinfo online wanneer merk/model bekend zijn.
3. Draai `marktplaats-copy-qa` met minimaal twee `--require` termen en één `--variant`; schrijf resultaat naar `ad.json`.
4. Stop als `copyQuality.passed` niet `true` is.
5. Kies categorie en probe categorie/formulier background-first.
6. Vul titel, beschrijving, conditie, prijs en levering.
7. Upload foto's via echte uploader-flow.
8. Selecteer gratis advertentievorm waar relevant; totaal moet `0,00` zijn tenzij de gebruiker expliciet betaalde opties wil.
9. Verifieer vóór submit:
- titel <= 60 tekens
- Copy Quality Gate geslaagd
- omschrijving compleet en rond/onder 3500 tekens
- lokale `description.md` en Marktplaats `description_nl-NL` hebben dezelfde laatste zin
- foto-teller klopt
- foto-orientatie is gecontroleerd en alleen indien nodig geroteerd
- prijs/conditie/levering kloppen
- betaalde opties uit
10. Submit via echte knop.
11. Verifieer live advertentiepagina en werk register bij.
12. Als iets faalt, gebruik het self-healing protocol en stop bij stopcondities.
> Commentaar: als Marktplaats terugkomt met validatiefout, lees de fouttekst en herstel gericht. Niet opnieuw blind submitten.
## Bestaande Advertentie Bewerken
1. Open/bepaal edit-URL:
`https://www.marktplaats.nl/plaats/<adId>/edit`
2. Gebruik bij voorkeur background/browser-fetch voor inspectie.
3. Als React-editor nodig is, selecteer expliciet de edit-tab op URL/ad-id.
4. Controleer:
- `form#syi-form`
- `input[name="description_nl-NL"]`
- rich-text editor `[contenteditable="true"][role="textbox"]`
- bestaande `images.ids` en `images.urls`
- prijs, conditie, levering, foto's
5. Draai eerst Copy Quality Gate op de nieuwe tekst. Niet opslaan als de tekst te kort is of een keyworddump bevat.
6. Vul React-vriendelijk:
- titel via input + events
- omschrijving in contenteditable editor via selectie + `document.execCommand('insertText', false, text)` of vergelijkbare echte editor-input
- zet hidden `description_nl-NL` als fallback, maar hidden field alleen is niet voldoende bewijs
7. Verifieer vóór opslaan:
- titel <= 60
- Copy Quality Gate geslaagd
- omschrijving rond/onder 3500 tekens
- laatste zin/zoekvarianten aanwezig in `description_nl-NL`
- foto ids/urls intact
- foto-oriëntatie is gecontroleerd en alleen indien nodig gecorrigeerd
- betaalde opties uit
8. Klik echte `Opslaan`-knop via DOM-event.
9. Verifieer live op `/seller/view/<adId>` dat nieuwe titel/omschrijving zichtbaar zijn.
10. Werk lokaal register en `ad.json` bij.
11. Als iets faalt, gebruik het self-healing protocol en stop bij stopcondities.
> Commentaar: de zichtbare editor kan anders rapporteren dan hidden field. Bewijs is pas voldoende als de live advertentie na opslaan de nieuwe tekst toont.
## Lokaal Register
Centrale locatie:
`~/Documents/OpenClaw/Data/marktplaats/advertenties.json`
Per advertentie:
`~/Documents/OpenClaw/Data/marktplaats/<slug>/ad.json`
`~/Documents/OpenClaw/Data/marktplaats/<slug>/description.md`
`~/Documents/OpenClaw/Data/marktplaats/<slug>/photos/`
Werk bij na dry-run, plaatsing, wijziging, validatiefout, verwijdering, statuscheck of herplaatsing.
Breid per-advertentie `ad.json` uit met `copyQuality`:
```json
"copyQuality": {
"checkedAt": "2026-06-08T15:00:00.000Z",
"chars": 3421,
"words": 515,
"paragraphs": 8,
"minChars": 3200,
"maxChars": 3500,
"passed": true,
"hasNaturalSeo": true,
"hasIntentionalVariant": true,
"hasKeywordDump": false,
"requiredTerms": ["merk", "productsoort"],
"requiredMissing": [],
"variantTerms": ["natuurlijke zoekvariant"],
"variantMatches": ["natuurlijke zoekvariant"],
"lastSentence": "Stuur gerust een bericht als je wilt controleren of dit past.",
"lastSentenceVerified": true
}
```
> Commentaar: het register is niet alleen administratie; het voorkomt dat toekomstige taken opnieuw moeten gokken welke prijs, titel, foto's, copy-QA of status gelden.
## Stopcondities
Stop en rapporteer wanneer:
- De Copy Quality Gate faalt of niet is uitgevoerd.
- `ad.json.copyQuality.passed` niet `true` is.
- De omschrijving te kort is, keyworddump bevat, geen natuurlijke SEO heeft, geen subtiele zoekvariant/spelfout bevat, of laatste zin niet zichtbaar is.
- Marktplaats naar betalen/captcha/login/security challenge gaat.
- De edit/plaats-pagina betaalde opties verplicht lijkt te maken.
- De omschrijving ondanks compacte tekst niet volledig wordt geaccepteerd.
- De foto-uploader geen zichtbare fototeller/`images.urls` opbouwt.
- Er onzekerheid is over foto's, prijs, conditie of meegeleverde onderdelen.
- Browserautomation foreground sterk verstoort en er geen background-route meer is.
- Self-healing dezelfde foutklasse 2-3 keer niet oplost.
> Commentaar: stoppen is hier beter dan “nog even proberen” als dat de browser stoort, copykwaliteit niet klopt of een betaal/security-flow raakt.
## Generieke Lessons Learned
- Copykwaliteit is een harde gate, niet een voorkeur. Eerst 3200-3500 tekens natuurlijke SEO met bewijs, dan pas UI-upload/submit.
- Niet de actieve browser willekeurig kapen.
- Eerst lokaal voorbereiden, copy-QA, background/browser-fetch/probe.
- Als browsercontext nodig is, gebruik een dedicated tab, exact op URL/ad-id geselecteerd, en herstel context.
- Houd omschrijving rond/onder 3500 tekens.
- Bij foto-upload zijn API-id's alleen niet genoeg; React moet ook urls en fototeller hebben.
- Bij edit is hidden field alleen niet genoeg bewijs; live advertentiepagina is de waarheid.
- Roteer foto's alleen wanneer nodig, na controle van preview of metadata.
- Houd de UI-flow lineair: geen extra vensters, geen losse testschermen, geen parallelle interactiestromen.
- ASCII-safe tekst is de fallback wanneer browser-encoding of live rendering mojibake laat zien.
- Concrete advertentie-id's, persoonlijke namen en productcases horen niet als permanente voorbeelden in deze skill; bewaar zulke details alleen in het lokale advertentieregister of taakverslag.
don't have the plugin yet? install it then click "run inline in claude" again.