Tutorial For Power Users

Laat Hermes doorgaan tot het af is: `/goal` en `/subgoal` in de praktijk

Hermes Agent

Hermes Agent

@hermesagents

May 17, 2026

8 min lezen

De meeste AI-agents draaien één beurt tegelijk. Jij typt, zij reageren, zij wachten. Jij bent de loop. De agent is gewoon een functieaanroep.

Hermes Agent heeft die modus — dat is de default. Maar er zit ook een andere modus in, /goal genaamd, waarbij de agent de loop draait. Je zet een doel plus succescriteria, de agent stelt voor, voert uit, evalueert, probeert opnieuw, en blijft doorgaan totdat een aparte judge-LLM het ermee eens is dat de criteria gehaald zijn. v0.14.0 (16 mei 2026) voegde /subgoal toe zodat je extra criteria over een lopende loop kunt leggen zonder te herstarten (#25449).

Dit stuk loopt door wat er echt gebeurt, wanneer het de juiste tool is, en de faalmodi die het de verkeerde tool maken.

De default-modus (ter vergelijking)

Elke chat-sessie in Hermes is één beurt per user-bericht. De agent leest je bericht, roept eventueel tools aan, en geeft een antwoord terug. Is de taak niet klaar, dan moet je hem porren: "ga door", "probeer opnieuw", "wat als X". Jij bent de outer loop.

Prima voor verkennend werk — "leg deze code uit", "schets een memo", "vind een bug". Je wilt dat de agent na elke stap pauzeert zodat je kunt bijsturen.

Het is niet prima voor taken waar de succesconditie concreet is en het pad ernaartoe iteratief. "Refactor deze module tot pytest slaagt" is een dertig-beurten-taak als jij elke beurt aanstuurt. Met /goal is het één commando.

Wat /goal echt doet

/goal Make all tests in tests/api/ pass. Don't change the test assertions. Done when pytest exits 0.

Als je dat instuurt, gebeuren er drie dingen:

  1. 1.De goal-tekst wordt de target-prompt voor de worker. Elke volgende beurt krijgt het worker-model een system-bericht met daarin het doel en de huidige beste poging.
  2. 2.Na elke worker-beurt draait een aparte "judge"-LLM-aanroep. De judge ziet het doel, de huidige stand en de voorgestelde voltooiing. Hij geeft of "done" terug (loop stopt) of "ga door, dit ontbreekt nog".
  3. 3.De loop gaat door tot de judge "done" zegt — of tot je het zelf met /stop afkapt, of tot de geconfigureerde iteratie-limiet wordt geraakt.

De judge is het cruciale stuk. Het is niet dezelfde LLM-aanroep als de worker, en hij ziet niet de chain of thought — alleen het doel en de huidige stand. Die scheiding is waarom /goal werkt: een worker-model dat zichzelf er al van overtuigd heeft dat zijn antwoord klopt, is een slechte rechter. Een verse LLM-aanroep zonder context is een veel betere.

Dit patroon, intern in de Hermes-codebase, heet de "Ralph loop" naar de kanonieke pseudocode while not done: do(work); ralph = judge(work). De /subgoal-uitbreiding van v0.14.0 laat de gebruiker nieuwe judge-criteria in een lopende loop injecteren.

/subgoal — criteria mid-vlucht toevoegen

Je hebt een /goal gestart om een module te refactoren. Drie loops verder besef je dat je de refactor ook cyclomatische complexiteit onder de 10 per functie wilt laten houden. Je wilt de loop niet stoppen en herstarten.

/subgoal Each function must have cyclomatic complexity <= 10.

De eerstvolgende keer dat de judge draait, telt hij die nieuwe constraint mee. Haalt de huidige beste poging dat niet, dan blijft de loop draaien. Haalt hij hem wel, dan stopt de loop.

Dit is het soort feature dat klein lijkt in een release-notes-bullet — "user-added criteria appended to an active /goal" — en dat dragend blijkt voor iedereen die de loop daadwerkelijk gebruikt. Echte doelen worden verfijnd terwijl je de agent ziet werken. Zonder /subgoal was verfijnen alleen mogelijk via /stop + opnieuw definiëren + nogmaals /goal — waarbij je de in-progress state kwijtraakte.

Praktische voorbeelden

Refactoren tot de tests slagen

/goal Refactor src/api/users.py so the User class follows the new naming convention in src/conventions.md. Don't break any existing tests. Done when:
1. pytest exits 0
2. The User class matches the convention rules in conventions.md

De worker probeert refactors, de judge checkt beide condities. Als beide groen zijn, stopt de loop.

Itereren op een UI

/goal Make the button on /pricing more prominent. Done when:
1. The button is the largest interactive element above the fold on desktop
2. It uses the primary brand color (#FF5A50)
3. Existing Lighthouse accessibility score doesn't drop

De worker past CSS aan, de judge maakt een screenshot via de browser-tool en checkt. Veel iteraties zonder dat jij hoeft babysitten.

Een bug vinden

/goal Find the cause of the intermittent test failure in tests/auth/test_session.py::test_logout_clears_cookie. Done when you produce a minimal failing repro and a one-paragraph explanation.

De judge checkt hier of beide delen van de deliverable er zijn — repro én uitleg — niet of er één van de twee is geland. /subgoal laat je een constraint toevoegen als "uitleg moet refereren aan de relevante request/response-cyclus" als de eerste poging te vaag is.

Wanneer je dit niet moet gebruiken

/goal is de verkeerde tool voor taken waar:

  • De succesconditie vaag is. "Maak dit eleganter" — de judge kan dat niet consistent beoordelen, dus de loop oscilleert of stempelt zomaar af. Pak hier beurt-voor-beurt.
  • Je het werk wilt zien terwijl het gebeurt. Elke iteratie loopt af voordat de judge afgaat, dus je hebt niet dezelfde per-turn-zichtbaarheid. Pak beurt-voor-beurt of /handoff als tussentijdse review telt.
  • De kosten zwaarder wegen dan de snelheid. Elke loop-iteratie is een worker-call plus een judge-call. Voor een 10-iteratie-goal betaal je 20 LLM-calls. De moeite waard voor refactor-werk; verspilling voor "hoe noem ik deze variabele".
  • Je niet over de succescriteria hebt nagedacht. Slechte criteria → slechte loop. /goal beloont specificiteit, en de agent buit ambiguïteit uit.

Hoe /goal met /handoff samenspeelt

v0.14.0 leverde ook /handoff, dat een live sessie zonder context-verlies tussen modellen overzet (#23395). De twee combineren goed: je kunt een goal-in-progress van een snel model overdragen aan een deep-reasoning-model wanneer de goal iets raakt wat het snelle model niet aankan. De judge blijft dezelfde criteria toetsen; de worker is gewoon beter geworden.

Hetzelfde met /sessions (#20805) — je kunt een goal onderbreken, naar een andere sessie bladeren en de goal later hervatten. De loop-state is gecheckpoint.

Waar dit in de agent-stack zit

Drie vormen van autonoom werk, in toenemende mate van hoeveel jij stuurt:

  1. 1.Beurt-voor-beurt — jij stuurt, agent reageert. Conversational.
  2. 2./goal — jij zet criteria, agent loopt tot ze gehaald zijn. Begrensde autonomie.
  3. 3.Cron-scheduling — agent draait onbeheerd op een schema, met aflevering naar messaging-platforms. Onbegrensde autonomie in de tijd.

/goal zit in het midden. Het is het juiste gereedschap voor een categorie taken die voorheen of zwaar babysitten of een custom-script vereiste. De /subgoal van v0.14.0 maakt de loop mid-vlucht stuurbaar, en dat is wat hem van een curiositeit naar een dagelijks gereedschap brengt.

Verder lezen

Abonneer op updates

Community-updates over Hermes Agent-releases, nieuwe vaardigheden en integraties. Geen spam, altijd opzegbaar.