Taakbeheer voor AI-agents: de claimlus als contract, niet als prompt
Zo beheer je taken van AI-agents met een claimlus die de server afdwingt: leases, heartbeats, vragen, bewijsstukken en een limiet op menselijke aandacht.
Weft is het AI-takenbeheer voor solo-oprichters en kleine teams.
Door Andrei Finogeev ·
Taakbeheer voor AI-agents werkt wanneer het bord de lus in handen heeft, niet de prompt: de agent vraagt wat hij moet doen, claimt één taak met een lease die verloopt als hij stil wordt, vraagt de persoon alleen om beslissingen die bij die persoon horen, en rondt af met een bewijsstuk dat iemand kan controleren. In Weft is elk van die stappen een MCP-tool die de server controleert, dus een agent die een stap overslaat, wordt geweigerd of verliest de taak in plaats van ongemerkt uit de pas te raken.
Wij maken Weft. Feiten over andere producten komen van hun officiële pagina's, gecontroleerd op 27 oktober 2026.
Waarom werkt een takenlijst die je in de chat plakt na een tijdje niet meer?
Taken in een chat plakken is het eerste wat iedereen probeert, en het werkt een middag lang. Dan eindigt de chat, en de stand van zaken eindigt mee. De agent wist welk item hij had afgerond, welk hij had opgegeven en waar hij niet zeker van was. Nu weet niemand het meer.
Degene die de lijst plakte, wordt de doorgeefluik: resultaten terugkopiëren naar het echte bord en werk overdoen dat een tweede sessie had opgepakt, omdat nergens stond dat het al bezet was.
Toegang tot het bord lost het probleem van de momentopname op, maar niet de rest. Als de enige tools “kaart verplaatsen” en “reactie toevoegen” zijn, hangt de lus nog steeds af van een afspraak in de instructies van de agent. Afspraken breken precies wanneer het misgaat: de agent crasht midden in een run, of twee agents beginnen op hetzelfde moment.
Hoe ziet de claimlus eruit als contract?
In Weft heeft de lus vijf stappen, en elke stap is een aparte tool op één MCP-endpoint, https://letsweft.com/api/mcp. De server bewaart de stand tussen de stappen, dus de lus overleeft het einde van elke chat.
- get_my_work: vragen voordat je kiest. Het antwoord omvat wat deze client al vasthoudt, wat er op de persoon wacht, wat te laat is of binnenkort af moet, en of er überhaupt ruimte is om iets te beginnen.
- start_task: claimen met een lease. De claim duurt 20 minuten en verplaatst de taak naar Doing. Het antwoord bevat een
runId, eenleaseTokenenrenewEverySeconds: 300. Een tweede client die dezelfde taak probeert, krijgtalready_claimeden een hint om het werk niet te dupliceren. - report_progress: de heartbeat. Elke aanroep met het run-id en het lease-token verlengt de lease. Valt de agent weg, dan stoppen de heartbeats, en 20 minuten later wordt de run als verlopen gemarkeerd en gaat de taak terug naar niet-toegewezen, zodat iedereen hem kan oppakken. Een verloren lease antwoordt met
lease_lost, zodat de agent weet dat het werk niet meer van hem is. - request_input: alleen voor beslissingen die van de persoon zijn. Een vraag van maximaal 500 tekens, met maximaal 10 opties. De claim blijft staan terwijl de agent wacht.
- complete_task: afronden met een bewijsstuk.
outcome,artifacts(bewijs zoals een URL, een commit of een bestandshash),notDone,unknownsennextStep.
Waarom een lease en geen status? Omdat stilte het enige signaal is dat een gecrashte agent kan sturen. Een kaart in Doing zegt dat iemand er ooit aan werkte. Een lease zegt dat iemand er nu aan werkt, en houdt daar vanzelf mee op zodra dat niet meer klopt.
De claim zelf is één insert in de database, bewaakt door een unieke index. Racen twee agents, dan beslist de database wie wint, dus ze kunnen de taak niet allebei krijgen. Twee reacties “Geclaimd” die een seconde na elkaar worden geplaatst, zijn daarentegen allebei geldige reacties.
Wanneer moet de agent request_input aanroepen?
Wanneer hij iets bereikt wat alleen de persoon kan beslissen: alles wat onomkeerbaar is, zoals geld, publiceren, productie of juridische zaken, of een echte splitsing zonder redelijke standaard. Niet om toestemming te vragen om door te gaan.
Die terughoudendheid telt, omdat een vraag de persoon evenveel aandacht kost als een afgeronde taak, en in Weft telt hij mee voor dezelfde limiet. De vraag komt in de Inbox terecht, met een pushmelding op mobiel en, voor items die 20 minuten of langer wachten, een herinnering per e-mail. Weft roept de agent nooit terug: het antwoord komt binnen bij zijn volgende start_task of get_my_work. Zolang de vraag openstaat, houdt de agent de taak 60 minuten vast; daarna vervalt de lease, maar de vraag blijft staan.
Wat zit er in een complete_task-aanroep?
Een korte uitkomst, bewijs, en een eerlijk verslag van de randen. Hier is een realistische payload voor een bugfix:
{
"id": "9b2f6c1e-4d7a-4c3b-8e21-5a0f3d9c7b14",
"runId": "d41e8a90-2f6b-4e17-9c3a-71b5e0a4c8f2",
"leaseToken": "lt_3f9a…",
"outcome": "Fixed the 500 on /api/invoices when the customer has no billing address. Fix is in PR #418; the route now returns 422 with a field error.",
"artifacts": [
{ "kind": "url", "uri": "https://github.com/acme/app/pull/418" },
{ "kind": "commit", "uri": "a1c9e07" },
{ "kind": "url", "uri": "https://preview-418.acme.dev/api/invoices/health", "httpStatus": 200 }
],
"claims": [
"Added a test for an empty billing address; the invoices test file passes locally"
],
"notDone": [
"Did not merge the PR",
"Did not backfill the 14 invoices that failed last week"
],
"unknowns": [
"Whether the mobile app shows the 422 message or a generic error"
],
"nextStep": "Merge PR #418 to main"
}Artifacts zijn dingen die de persoon kan controleren zonder de agent op zijn woord te geloven. notDone en unknowns zijn geen bekentenissen; ze maken het verschil tussen een resultaat waarop je kunt bouwen en een resultaat dat je uit de diff moet reconstrueren. De aanroep faalt nooit bij ontbrekend bewijs, want afgerond werk kwijtraken is erger dan het ongeverifieerd vastleggen. Meer over het lezen van deze bewijsstukken in wat heeft mijn AI-agent gedaan.
Hoe verschilt dit van een kaart verplaatsen en een reactie plaatsen?
De gids van Hypertask over dezelfde lus (claimen, bijwerken, rapporteren, sluiten) is een goede beschrijving van de gewoonte. Hun MCP-versie van een claim is de taak laden, hem naar de werksectie verplaatsen en een claimreactie plaatsen, gestuurd door een prompt die het team in de instructies van de agent schrijft. Hier is dezelfde lus stap voor stap:
| Stap in de lus | Bord dat alleen op afspraken leunt (de agent verplaatst een kaart en reageert) | Wat Weft afdwingt, en met welke MCP-tool |
|---|---|---|
| Werk kiezen | De agent somt taken op en kiest. Niets vertelt hem dat de persoon al onder de beoordelingen bedolven ligt. | get_my_work geeft terug wat deze client al vasthoudt, wat op de persoon wacht, wat te laat is, en of er ruimte is om iets te beginnen. |
| Claimen | Kaart naar Doing verplaatsen en “Geclaimd” plaatsen. Twee agents kunnen dat op hetzelfde moment doen en allebei denken dat de taak van hen is. | start_task neemt een lease van 20 minuten in één databaseschrijfactie, bewaakt door een unieke index. De verliezer krijgt already_claimed met het id en de titel van de taak. |
| In leven blijven | Voortgangsreacties, als de agent eraan denkt. Een gecrashte agent laat een kaart voor onbepaalde tijd in Doing staan. | report_progress verlengt de lease (de agent krijgt de opdracht dat elke 5 minuten te doen). Na 20 stille minuten wordt de run als verlopen gemarkeerd en is de taak weer vrij. |
| Vragen | Een reactie “Geblokkeerd:”. De agent stopt of gokt; de kaart kan er nog steeds uitzien alsof eraan gewerkt wordt. | request_input zet een vraag met maximaal 10 opties in de Inbox van de persoon en houdt de claim vast (60 minuten zolang hij geparkeerd staat). Het antwoord komt terug via start_task of get_my_work. |
| Rapporteren | Een laatste reactie in vrije tekst. Hoe die eruitziet, hangt af van hoe goed de prompt was. | complete_task neemt benoemde velden: outcome, artifacts, notDone, unknowns, nextStep. |
| Sluiten of beoordelen | De agent verplaatst de kaart naar Review of Done, wat de prompt maar zei. | Standaard gaat de taak naar Done. Hij stopt in de Inbox voor Accepteren / Herwerken / Later / Laten vallen wanneer de taak beoordeling nodig heeft of een verificatiecontrole faalt. |
| Overbelasting | Niets. Agents blijven werk beginnen en de Review-kolom groeit. | start_task weigert met attention_queue_full zodra er 5 items (één persoon) of 10 (team) op mensen wachten, of 45 minuten aan beoordelen. |
Eerlijk tegenover Hypertask: het heeft wel echte leases. De documentatie noemt endpoints voor het claimen, de heartbeat en het vrijgeven van een lease, en de tabel met bekende beperkingen zegt dat taak-leases, bewijs en escalatie bewust alleen REST-endpoints zijn (MCP-overzicht van Hypertask). De toolreferentie heeft onder de 21 MCP-tools geen lease-tool (toolreferentie). De CLI kan ook claimen, als optioneel commando (changelog, CLI-referentie). Een gescripte agent op Hypertask kan dus een lease vasthouden; een agent die via MCP in Claude Code of Cursor werkt, krijgt de versie met kaart en reactie, tenzij iemand de REST-aanroepen inbouwt.
Draaien je agents als scripts en CI-jobs, dan zijn de CLI en REST API van Hypertask een echt voordeel, en Weft heeft geen van beide: geen CLI, geen openbare REST API, geen webhooks. Weft is voor agents die in een MCP-client leven en daar de lus nodig hebben.
Wat ziet de persoon?
Meestal een kaart in Done: standaard gaat een afgeronde taak er rechtstreeks heen, met de uitkomst en het bewijs eraan vast.
Een taak stopt in de Inbox van de persoon wanneer hij gemarkeerd was als te beoordelen, of wanneer een verificatiecontrole faalt. Daar kiest de persoon een van vier antwoorden:
- Accepteren: het werk blijft staan. Heeft de agent een nextStep meegegeven, dan ziet de persoon die boven de knop (“Als je accepteert, gaat de agent …”), en accepteren keurt precies die stap goed, niets ruimers. De goedkeuring geldt 72 uur en gaat terug naar de agent via get_my_work of start_task.
- Herwerken: terugsturen, met een notitie over wat er mis is.
- Later: niet nu. Laten vallen: er niet meer aan werken.
De Inbox staat op het web, en wanneer er iets binnenkomt, krijgt de persoon ook een pushmelding in de mobiele app van Weft. De afspraak rond nextStep voorkomt dat een agent “ziet er goed uit” opvat als toestemming om te mergen, te deployen en te versturen: hij mag de ene goedgekeurde stap uitvoeren en rondt de taak daarna opnieuw af.
Waarom wordt de agent geweigerd in plaats van meer werk te beginnen?
Omdat aandacht de schaarse grondstof is, niet werk. Een agent kan tien dingen beginnen in de tijd dat een persoon er één beoordeelt.
Weft telt wat er op mensen wacht: taken die op beoordeling wachten plus open vragen. Bereikt dat 5 items in een werkruimte voor één persoon, 10 in een team, of ongeveer 45 minuten aan geschatte beoordelingstijd, wat het eerst bereikt wordt, dan weigert start_task met attention_queue_full. De limiet hangt af van het aantal mensen in de werkruimte, niet van het plan.
De weigering is een instructie, geen doodlopende weg. Ze meldt de grootte van de wachtrij, de leeftijd van het oudste item en de aanroepen die nog wel mogen: report_progress, get_my_work, get_board_state en search. Een stap die de persoon op die kaart al heeft goedgekeurd, is uitgezonderd, dus een geaccepteerde “merge PR #418” wordt niet door de wachtrij tegengehouden.
Hoe stel ik dit in?
Verbind je client en meld je aan via de browser; er is geen sleutel om te kopiëren. Weft geeft refresh-tokens uit, dus de client vernieuwt de aanmelding zelf. In Claude Code is het één commando, claude mcp add --transport http weft https://letsweft.com/api/mcp (setuppagina). Cursor heeft een installatie met één klik (Cursor), Codex heeft een configuratieregel en codex mcp login weft nodig (Codex), en ChatGPT heeft een gepubliceerde Weft-app op elk plan, ook Free (ChatGPT). De server beschrijft de lus zelf aan de agent, dus een prompt over de levenscyclus is niet nodig.
Voor een rondleiding in Claude Code, zie een takenbord voor Claude Code. Voor meerdere agents op één bord, waar leases en already_claimed het meest tellen, zie meerdere AI-agents, één bord. Het protocol zelf is gedocumenteerd op modelcontextprotocol.io, en andere MCP-borden worden vergeleken bij MCP-taakmanagers.
Wat doet Weft hier niet?
- Geen CLI, openbare REST API of webhooks, dus cronjobs en CI-pipelines kunnen de lus niet buiten een MCP-client aansturen.
- Geen integratie met GitHub of Slack. Bewijs is wat de agent in artifacts linkt.
- Geen ingebouwde AI. Het denkwerk gebeurt in je eigen AI-client, en daarom heeft Weft ook geen AI-credits nodig.
Free dekt 50 taken en 200 AI-aanroepen per maand. Pro kost $7 per plek per maand of $60 per plek per jaar (prijzen).
- Is een goede prompt niet genoeg om agents de lus te laten volgen?
- Een prompt beschrijft de lus; hij kan hem niet afdwingen. Hij houdt niet tegen dat twee agents dezelfde taak claimen, en hij kan geen taak vrijgeven die vastzit bij een gecrashte agent. In Weft is de claim een lease die de server beheert, dus die gevallen worden afgehandeld, of de agent zijn instructies nu onthield of niet.
- Wat gebeurt er als mijn agent halverwege crasht?
- Zijn heartbeats stoppen. Twintig minuten na de laatste report_progress wordt de run als verlopen gemarkeerd, wordt het lease-token gewist en is de taak weer niet-toegewezen, zodat een andere agent of een persoon hem kan oppakken. De kaart blijft niet een week in Doing staan.
- Wacht elke afgeronde taak tot ik hem beoordeel?
- Nee. Standaard gaat een afgeronde taak rechtstreeks naar Done, met de uitkomst en het bewijs. Hij stopt alleen in je Inbox voor Accepteren, Herwerken, Later of Laten vallen wanneer de taak beoordeling nodig heeft of een verificatiecontrole faalt.
- Waarom zou ik willen dat mijn agent werk geweigerd wordt?
- Omdat hij anders dingen blijft produceren die je geen tijd hebt om te controleren. Zodra er 5 items (10 voor een team) of ongeveer 45 minuten aan beoordelen op mensen wachten, geeft start_task attention_queue_full terug en wijst de agent op wat hij nog wel kan doen. De wachtrij wegwerken haalt de blokkade weg.
- Hypertask heeft ook leases. Waarom doet MCP ertoe?
- De leases van Hypertask zijn REST-endpoints, volgens de eigen documentatie (MCP-overzicht), en de CLI kan ook claimen. Dat past bij gescripte agents. Een agent die via MCP-tools in een editor of chat werkt, krijgt ze daar niet, en in Weft wel: start_task, report_progress en complete_task zijn MCP-tools.