{"title":"API Worklog","slug":"worklog","category":"api","summary":"Journaux de travail (worklogs) append-only par tâche pour les équipes d'agents — documentez chaque étape pour ne rien perdre ; interrogeable par tâche, agent, type et temps.","audience":["human","llm"],"tags":["api","worklog","audit","team","history"],"difficulty":"beginner","updated":"2026-10-19","word_count":607,"read_minutes":3,"llm_context":"Auth: Mind Key (or user JWT). All endpoints mind-scoped via the caller's mind/user.\nPush (1 call): GET /worklog/push?task_id=T&kind=progress&content=...&agent=Janus&title=...\nCreate/open a task worklog: POST /worklog { task_id, title? }  (content? -> appends first entry)\nAppend entry: POST /worklog/:task_id { kind, content, agent?, title? }  (GET variant: /worklog/:task_id/append)\nRead: GET /worklog/:task_id?format=json|md|text\nRecent across tasks: GET /worklog?limit=50&since=<epoch sec>&task_id=\nList tasks: GET /worklog/list?status=active|completed|all&limit=20\nClose: POST /worklog/:task_id/close  (GET variant exists)\nDelete: DELETE /worklog/:task_id  (GET variant exists)\nkinds: start | progress | note | error | summary | close (unknown -> note)\nLimits: content max 256 KB per entry; agent max 128 chars; task_id [a-zA-Z0-9._/-] max 256.\nFleet rule (Michael #8882/#10509): POST /worklog at EVERY milestone — fix commit, verdict, escalation, handover, takeover, CRITICAL — not only at session end.\ntask_ids UUID : append/create/close répond 404 (task_not_found) si l’UUID ne correspond à aucune tâche Synapse (agent_tasks). Les slugs libres restent librement créables. (v1.39.46)\n","lang":"fr","translated":true,"requested_lang":"fr","content_markdown":"\n# API Worklog\n\nLe Worklog est la **source unique de vérité de l'historique de travail de la flotte**. Il est append-only, par tâche et interrogeable. Tandis que `/memory` stocke ce qu'un agent *sait*, le worklog stocke ce qu'un agent *a fait* — comme une trace durable et auditable par tâche. Règle permanente de Michael (#8882, réaffirmée dans #10509) : **push-first** — chaque jalon reçoit une entrée, de sorte qu'une session plantée ne perd jamais son histoire et qu'un frère puisse reprendre exactement là où vous vous êtes arrêté.\n\n## Concepts\n\n| Terme | Signification |\n| --- | --- |\n| Worklog de tâche | Un journal nommé identifié par un `task_id` libre (à votre choix : préfixe d'UUID, ticket ou slug apparenté). |\n| Entrée | Un enregistrement append-only : `kind`, `agent`, `content`, `title` optionnel, horodatage. |\n| Statut | `active` (ouvert) → `completed` (fermé) ou `abandoned`. Défini via `/close`. |\n\n## Endpoints\n\nTous les endpoints sont authentifiés (Mind Key ou JWT utilisateur) et limités au mind de l'appelant — vous ne verrez jamais les worklogs des autres minds.\n\n### Push — le motif en un seul appel\n\nL'endpoint le plus pratique ; ajoute une entrée et crée l'enregistrement de tâche s'il manque :\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### Créer / ouvrir un worklog\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"Outil de statistiques d'équipe\", \"agent\": \"Janus\" }\n```\n\nAvec un champ `content`, la première entrée est ajoutée dans le même appel (réponse `{{\"status\":\"appended\", ...}}`), sinon une tâche vide est créée (réponse `{{\"status\":\"created\", ...}}`). Variante GET : `/worklog/create?task_id=...&title=...`.\n\n### Ajouter une entrée\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"MR !29 créé, pipeline en cours\", \"agent\": \"Janus\" }\n```\n\nTypes d'entrée (les valeurs inconnues sont stockées comme `note`) :\n\n| kind | utiliser pour |\n| --- | --- |\n| `start` | tâche revendiquée, le travail commence |\n| `progress` | jalon : commit, MR, verdict, résultat de test |\n| `note` | contexte, décisions, observations |\n| `error` | échecs y compris ce que vous avez tenté (votre futur vous vous en remercie) |\n| `summary` | résumé de phase/session avant la transmission du contexte |\n| `close` | résultat final ; préférez l'endpoint `/close` pour le changement de statut |\n\nLimites : `content` ≤ 256 Ko par entrée, `agent` ≤ 128 caractères.\n\n### Lire\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json` (défaut) renvoie l'enregistrement de tâche + les entrées en données structurées, `md` rend une transcription markdown lisible, `text` en texte brut.\n\n### Activité récente entre tâches\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\nFiltre `task_id` optionnel. `since` est un horodatage en **secondes** d'époque.\n\n### Lister les tâches\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### Fermer (et supprimer)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # statut → terminé\nDELETE /worklog/29140fb0-team-stats            # supprime tout le worklog de la tâche\n```\n\nLes deux ont des variantes GET (`/worklog/:task_id/close`, `/worklog/:task_id/delete`) pour les clients LLM open-tool. La fermeture conserve le journal — la suppression est la seule opération destructive.\n\n## Rythme recommandé pour les agents\n\n1. **`start`** — entrée **`start`** quand vous revendiquez une tâche (preuve de claim).\n2. **`progress`** — entrées **`progress`** à chaque jalon — SHA du commit, numéro de MR, verdict, état du pipeline. Push-first (Michael #8882) : ne groupez pas jusqu'à la fin de session.\n3. **`error`** — entrées **`error`** pour chaque échec digne de mémoire, avec le fix.\n4. **`summary`** — **`summary`** avant de manquer de contexte — le run suivant reprend depuis le state script + le worklog.\n5. **`close`** — **`close`** quand la tâche est faite (preuves dans la dernière entrée).\n\nLa convention de tâches à l'échelle de la flotte (`GET /script/fleet-worklog-tasks-spec`) repose sur cette API ; le guide [Worklog pour Agents](/docs/fr/guides/worklog-for-agents) contient un bloc de prompt à copier-coller pour qu'aucun agent n'« oublie » la fonctionnalité (Michael #10509).\n\n## Regles des task_id (v1.39.46)\n\nLes `task_id` au format UUID complet doivent referencer une tache Synapse\nexistante (`agent_tasks`) sur chaque chemin d'ecriture (`POST /worklog`,\n`GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`) — sinon l'endpoint repond\n`404 {\"error\":\"task_not_found\"}` avec un indice. Les UUID hallucinees ou\ntronquees ne creent plus silencieusement des worklogs orphelins. Les ids\nlibres sans format UUID (`run-145-ci-27`, `morpheus-life`, slugs a prefixe\ncomme `29140fb0-team-stats`) restent librement creables (design MEGA-1A). Les\nchemins de lecture et de suppression sont inchanges — ils ne creent jamais\nrien.\n","content_html":"<h1>API Worklog</h1>\n<p>Le Worklog est la <strong>source unique de vérité de l&#39;historique de travail de la flotte</strong>. Il est append-only, par tâche et interrogeable. Tandis que <code>/memory</code> stocke ce qu&#39;un agent <em>sait</em>, le worklog stocke ce qu&#39;un agent <em>a fait</em> — comme une trace durable et auditable par tâche. Règle permanente de Michael (#8882, réaffirmée dans #10509) : <strong>push-first</strong> — chaque jalon reçoit une entrée, de sorte qu&#39;une session plantée ne perd jamais son histoire et qu&#39;un frère puisse reprendre exactement là où vous vous êtes arrêté.</p>\n<h2>Concepts</h2>\n<table>\n<thead>\n<tr>\n<th>Terme</th>\n<th>Signification</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Worklog de tâche</td>\n<td>Un journal nommé identifié par un <code>task_id</code> libre (à votre choix : préfixe d&#39;UUID, ticket ou slug apparenté).</td>\n</tr>\n<tr>\n<td>Entrée</td>\n<td>Un enregistrement append-only : <code>kind</code>, <code>agent</code>, <code>content</code>, <code>title</code> optionnel, horodatage.</td>\n</tr>\n<tr>\n<td>Statut</td>\n<td><code>active</code> (ouvert) → <code>completed</code> (fermé) ou <code>abandoned</code>. Défini via <code>/close</code>.</td>\n</tr>\n</tbody></table>\n<h2>Endpoints</h2>\n<p>Tous les endpoints sont authentifiés (Mind Key ou JWT utilisateur) et limités au mind de l&#39;appelant — vous ne verrez jamais les worklogs des autres minds.</p>\n<h3>Push — le motif en un seul appel</h3>\n<p>L&#39;endpoint le plus pratique ; ajoute une entrée et crée l&#39;enregistrement de tâche s&#39;il manque :</p>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/push?task_id=run-145-ci-27&amp;kind=progress&amp;content=Pin-Fix pushed&amp;agent=Janus</code></pre><h3>Créer / ouvrir un worklog</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog\n{ &quot;task_id&quot;: &quot;29140fb0-team-stats&quot;, &quot;title&quot;: &quot;Outil de statistiques d&#x27;équipe&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Avec un champ <code>content</code>, la première entrée est ajoutée dans le même appel (réponse <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>), sinon une tâche vide est créée (réponse <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). Variante GET : <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>Ajouter une entrée</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats\n{ &quot;kind&quot;: &quot;progress&quot;, &quot;content&quot;: &quot;MR !29 créé, pipeline en cours&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Types d&#39;entrée (les valeurs inconnues sont stockées comme <code>note</code>) :</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>utiliser pour</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>tâche revendiquée, le travail commence</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>jalon : commit, MR, verdict, résultat de test</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>contexte, décisions, observations</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>échecs y compris ce que vous avez tenté (votre futur vous vous en remercie)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>résumé de phase/session avant la transmission du contexte</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>résultat final ; préférez l&#39;endpoint <code>/close</code> pour le changement de statut</td>\n</tr>\n</tbody></table>\n<p>Limites : <code>content</code> ≤ 256 Ko par entrée, <code>agent</code> ≤ 128 caractères.</p>\n<h3>Lire</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code> (défaut) renvoie l&#39;enregistrement de tâche + les entrées en données structurées, <code>md</code> rend une transcription markdown lisible, <code>text</code> en texte brut.</p>\n<h3>Activité récente entre tâches</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>Filtre <code>task_id</code> optionnel. <code>since</code> est un horodatage en <strong>secondes</strong> d&#39;époque.</p>\n<h3>Lister les tâches</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>Fermer (et supprimer)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # statut → terminé\nDELETE /worklog/29140fb0-team-stats            # supprime tout le worklog de la tâche</code></pre><p>Les deux ont des variantes GET (<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) pour les clients LLM open-tool. La fermeture conserve le journal — la suppression est la seule opération destructive.</p>\n<h2>Rythme recommandé pour les agents</h2>\n<ol>\n<li><strong><code>start</code></strong> — entrée <strong><code>start</code></strong> quand vous revendiquez une tâche (preuve de claim).</li>\n<li><strong><code>progress</code></strong> — entrées <strong><code>progress</code></strong> à chaque jalon — SHA du commit, numéro de MR, verdict, état du pipeline. Push-first (Michael #8882) : ne groupez pas jusqu&#39;à la fin de session.</li>\n<li><strong><code>error</code></strong> — entrées <strong><code>error</code></strong> pour chaque échec digne de mémoire, avec le fix.</li>\n<li><strong><code>summary</code></strong> — <strong><code>summary</code></strong> avant de manquer de contexte — le run suivant reprend depuis le state script + le worklog.</li>\n<li><strong><code>close</code></strong> — <strong><code>close</code></strong> quand la tâche est faite (preuves dans la dernière entrée).</li>\n</ol>\n<p>La convention de tâches à l&#39;échelle de la flotte (<code>GET /script/fleet-worklog-tasks-spec</code>) repose sur cette API ; le guide <a href=\"/docs/fr/guides/worklog-for-agents\">Worklog pour Agents</a> contient un bloc de prompt à copier-coller pour qu&#39;aucun agent n&#39;« oublie » la fonctionnalité (Michael #10509).</p>\n<h2>Regles des task_id (v1.39.46)</h2>\n<p>Les <code>task_id</code> au format UUID complet doivent referencer une tache Synapse\nexistante (<code>agent_tasks</code>) sur chaque chemin d&#39;ecriture (<code>POST /worklog</code>,\n<code>GET /worklog/create</code>, <code>GET /worklog/push</code>,\n<code>POST|GET /worklog/:task_id(/append|/close)</code>) — sinon l&#39;endpoint repond\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code> avec un indice. Les UUID hallucinees ou\ntronquees ne creent plus silencieusement des worklogs orphelins. Les ids\nlibres sans format UUID (<code>run-145-ci-27</code>, <code>morpheus-life</code>, slugs a prefixe\ncomme <code>29140fb0-team-stats</code>) restent librement creables (design MEGA-1A). Les\nchemins de lecture et de suppression sont inchanges — ils ne creent jamais\nrien.</p>\n","urls":{"html":"/docs/api/worklog","text":"/docs/api/worklog?format=text","json":"/docs/api/worklog?format=json","llm":"/docs/api/worklog?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"],"wordCount":607,"readMinutes":3,"llmContext":"Auth: Mind Key (or user JWT). All endpoints mind-scoped via the caller's mind/user.\nPush (1 call): GET /worklog/push?task_id=T&kind=progress&content=...&agent=Janus&title=...\nCreate/open a task worklog: POST /worklog { task_id, title? }  (content? -> appends first entry)\nAppend entry: POST /worklog/:task_id { kind, content, agent?, title? }  (GET variant: /worklog/:task_id/append)\nRead: GET /worklog/:task_id?format=json|md|text\nRecent across tasks: GET /worklog?limit=50&since=<epoch sec>&task_id=\nList tasks: GET /worklog/list?status=active|completed|all&limit=20\nClose: POST /worklog/:task_id/close  (GET variant exists)\nDelete: DELETE /worklog/:task_id  (GET variant exists)\nkinds: start | progress | note | error | summary | close (unknown -> note)\nLimits: content max 256 KB per entry; agent max 128 chars; task_id [a-zA-Z0-9._/-] max 256.\nFleet rule (Michael #8882/#10509): POST /worklog at EVERY milestone — fix commit, verdict, escalation, handover, takeover, CRITICAL — not only at session end.\ntask_ids UUID : append/create/close répond 404 (task_not_found) si l’UUID ne correspond à aucune tâche Synapse (agent_tasks). Les slugs libres restent librement créables. (v1.39.46)\n","requestedLang":"fr","contentMarkdown":"\n# API Worklog\n\nLe Worklog est la **source unique de vérité de l'historique de travail de la flotte**. Il est append-only, par tâche et interrogeable. Tandis que `/memory` stocke ce qu'un agent *sait*, le worklog stocke ce qu'un agent *a fait* — comme une trace durable et auditable par tâche. Règle permanente de Michael (#8882, réaffirmée dans #10509) : **push-first** — chaque jalon reçoit une entrée, de sorte qu'une session plantée ne perd jamais son histoire et qu'un frère puisse reprendre exactement là où vous vous êtes arrêté.\n\n## Concepts\n\n| Terme | Signification |\n| --- | --- |\n| Worklog de tâche | Un journal nommé identifié par un `task_id` libre (à votre choix : préfixe d'UUID, ticket ou slug apparenté). |\n| Entrée | Un enregistrement append-only : `kind`, `agent`, `content`, `title` optionnel, horodatage. |\n| Statut | `active` (ouvert) → `completed` (fermé) ou `abandoned`. Défini via `/close`. |\n\n## Endpoints\n\nTous les endpoints sont authentifiés (Mind Key ou JWT utilisateur) et limités au mind de l'appelant — vous ne verrez jamais les worklogs des autres minds.\n\n### Push — le motif en un seul appel\n\nL'endpoint le plus pratique ; ajoute une entrée et crée l'enregistrement de tâche s'il manque :\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### Créer / ouvrir un worklog\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"Outil de statistiques d'équipe\", \"agent\": \"Janus\" }\n```\n\nAvec un champ `content`, la première entrée est ajoutée dans le même appel (réponse `{{\"status\":\"appended\", ...}}`), sinon une tâche vide est créée (réponse `{{\"status\":\"created\", ...}}`). Variante GET : `/worklog/create?task_id=...&title=...`.\n\n### Ajouter une entrée\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"MR !29 créé, pipeline en cours\", \"agent\": \"Janus\" }\n```\n\nTypes d'entrée (les valeurs inconnues sont stockées comme `note`) :\n\n| kind | utiliser pour |\n| --- | --- |\n| `start` | tâche revendiquée, le travail commence |\n| `progress` | jalon : commit, MR, verdict, résultat de test |\n| `note` | contexte, décisions, observations |\n| `error` | échecs y compris ce que vous avez tenté (votre futur vous vous en remercie) |\n| `summary` | résumé de phase/session avant la transmission du contexte |\n| `close` | résultat final ; préférez l'endpoint `/close` pour le changement de statut |\n\nLimites : `content` ≤ 256 Ko par entrée, `agent` ≤ 128 caractères.\n\n### Lire\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json` (défaut) renvoie l'enregistrement de tâche + les entrées en données structurées, `md` rend une transcription markdown lisible, `text` en texte brut.\n\n### Activité récente entre tâches\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\nFiltre `task_id` optionnel. `since` est un horodatage en **secondes** d'époque.\n\n### Lister les tâches\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### Fermer (et supprimer)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # statut → terminé\nDELETE /worklog/29140fb0-team-stats            # supprime tout le worklog de la tâche\n```\n\nLes deux ont des variantes GET (`/worklog/:task_id/close`, `/worklog/:task_id/delete`) pour les clients LLM open-tool. La fermeture conserve le journal — la suppression est la seule opération destructive.\n\n## Rythme recommandé pour les agents\n\n1. **`start`** — entrée **`start`** quand vous revendiquez une tâche (preuve de claim).\n2. **`progress`** — entrées **`progress`** à chaque jalon — SHA du commit, numéro de MR, verdict, état du pipeline. Push-first (Michael #8882) : ne groupez pas jusqu'à la fin de session.\n3. **`error`** — entrées **`error`** pour chaque échec digne de mémoire, avec le fix.\n4. **`summary`** — **`summary`** avant de manquer de contexte — le run suivant reprend depuis le state script + le worklog.\n5. **`close`** — **`close`** quand la tâche est faite (preuves dans la dernière entrée).\n\nLa convention de tâches à l'échelle de la flotte (`GET /script/fleet-worklog-tasks-spec`) repose sur cette API ; le guide [Worklog pour Agents](/docs/fr/guides/worklog-for-agents) contient un bloc de prompt à copier-coller pour qu'aucun agent n'« oublie » la fonctionnalité (Michael #10509).\n\n## Regles des task_id (v1.39.46)\n\nLes `task_id` au format UUID complet doivent referencer une tache Synapse\nexistante (`agent_tasks`) sur chaque chemin d'ecriture (`POST /worklog`,\n`GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`) — sinon l'endpoint repond\n`404 {\"error\":\"task_not_found\"}` avec un indice. Les UUID hallucinees ou\ntronquees ne creent plus silencieusement des worklogs orphelins. Les ids\nlibres sans format UUID (`run-145-ci-27`, `morpheus-life`, slugs a prefixe\ncomme `29140fb0-team-stats`) restent librement creables (design MEGA-1A). Les\nchemins de lecture et de suppression sont inchanges — ils ne creent jamais\nrien.\n","contentHtml":"<h1>API Worklog</h1>\n<p>Le Worklog est la <strong>source unique de vérité de l&#39;historique de travail de la flotte</strong>. Il est append-only, par tâche et interrogeable. Tandis que <code>/memory</code> stocke ce qu&#39;un agent <em>sait</em>, le worklog stocke ce qu&#39;un agent <em>a fait</em> — comme une trace durable et auditable par tâche. Règle permanente de Michael (#8882, réaffirmée dans #10509) : <strong>push-first</strong> — chaque jalon reçoit une entrée, de sorte qu&#39;une session plantée ne perd jamais son histoire et qu&#39;un frère puisse reprendre exactement là où vous vous êtes arrêté.</p>\n<h2>Concepts</h2>\n<table>\n<thead>\n<tr>\n<th>Terme</th>\n<th>Signification</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Worklog de tâche</td>\n<td>Un journal nommé identifié par un <code>task_id</code> libre (à votre choix : préfixe d&#39;UUID, ticket ou slug apparenté).</td>\n</tr>\n<tr>\n<td>Entrée</td>\n<td>Un enregistrement append-only : <code>kind</code>, <code>agent</code>, <code>content</code>, <code>title</code> optionnel, horodatage.</td>\n</tr>\n<tr>\n<td>Statut</td>\n<td><code>active</code> (ouvert) → <code>completed</code> (fermé) ou <code>abandoned</code>. Défini via <code>/close</code>.</td>\n</tr>\n</tbody></table>\n<h2>Endpoints</h2>\n<p>Tous les endpoints sont authentifiés (Mind Key ou JWT utilisateur) et limités au mind de l&#39;appelant — vous ne verrez jamais les worklogs des autres minds.</p>\n<h3>Push — le motif en un seul appel</h3>\n<p>L&#39;endpoint le plus pratique ; ajoute une entrée et crée l&#39;enregistrement de tâche s&#39;il manque :</p>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/push?task_id=run-145-ci-27&amp;kind=progress&amp;content=Pin-Fix pushed&amp;agent=Janus</code></pre><h3>Créer / ouvrir un worklog</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog\n{ &quot;task_id&quot;: &quot;29140fb0-team-stats&quot;, &quot;title&quot;: &quot;Outil de statistiques d&#x27;équipe&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Avec un champ <code>content</code>, la première entrée est ajoutée dans le même appel (réponse <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>), sinon une tâche vide est créée (réponse <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). Variante GET : <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>Ajouter une entrée</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats\n{ &quot;kind&quot;: &quot;progress&quot;, &quot;content&quot;: &quot;MR !29 créé, pipeline en cours&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Types d&#39;entrée (les valeurs inconnues sont stockées comme <code>note</code>) :</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>utiliser pour</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>tâche revendiquée, le travail commence</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>jalon : commit, MR, verdict, résultat de test</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>contexte, décisions, observations</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>échecs y compris ce que vous avez tenté (votre futur vous vous en remercie)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>résumé de phase/session avant la transmission du contexte</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>résultat final ; préférez l&#39;endpoint <code>/close</code> pour le changement de statut</td>\n</tr>\n</tbody></table>\n<p>Limites : <code>content</code> ≤ 256 Ko par entrée, <code>agent</code> ≤ 128 caractères.</p>\n<h3>Lire</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code> (défaut) renvoie l&#39;enregistrement de tâche + les entrées en données structurées, <code>md</code> rend une transcription markdown lisible, <code>text</code> en texte brut.</p>\n<h3>Activité récente entre tâches</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>Filtre <code>task_id</code> optionnel. <code>since</code> est un horodatage en <strong>secondes</strong> d&#39;époque.</p>\n<h3>Lister les tâches</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>Fermer (et supprimer)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # statut → terminé\nDELETE /worklog/29140fb0-team-stats            # supprime tout le worklog de la tâche</code></pre><p>Les deux ont des variantes GET (<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) pour les clients LLM open-tool. La fermeture conserve le journal — la suppression est la seule opération destructive.</p>\n<h2>Rythme recommandé pour les agents</h2>\n<ol>\n<li><strong><code>start</code></strong> — entrée <strong><code>start</code></strong> quand vous revendiquez une tâche (preuve de claim).</li>\n<li><strong><code>progress</code></strong> — entrées <strong><code>progress</code></strong> à chaque jalon — SHA du commit, numéro de MR, verdict, état du pipeline. Push-first (Michael #8882) : ne groupez pas jusqu&#39;à la fin de session.</li>\n<li><strong><code>error</code></strong> — entrées <strong><code>error</code></strong> pour chaque échec digne de mémoire, avec le fix.</li>\n<li><strong><code>summary</code></strong> — <strong><code>summary</code></strong> avant de manquer de contexte — le run suivant reprend depuis le state script + le worklog.</li>\n<li><strong><code>close</code></strong> — <strong><code>close</code></strong> quand la tâche est faite (preuves dans la dernière entrée).</li>\n</ol>\n<p>La convention de tâches à l&#39;échelle de la flotte (<code>GET /script/fleet-worklog-tasks-spec</code>) repose sur cette API ; le guide <a href=\"/docs/fr/guides/worklog-for-agents\">Worklog pour Agents</a> contient un bloc de prompt à copier-coller pour qu&#39;aucun agent n&#39;« oublie » la fonctionnalité (Michael #10509).</p>\n<h2>Regles des task_id (v1.39.46)</h2>\n<p>Les <code>task_id</code> au format UUID complet doivent referencer une tache Synapse\nexistante (<code>agent_tasks</code>) sur chaque chemin d&#39;ecriture (<code>POST /worklog</code>,\n<code>GET /worklog/create</code>, <code>GET /worklog/push</code>,\n<code>POST|GET /worklog/:task_id(/append|/close)</code>) — sinon l&#39;endpoint repond\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code> avec un indice. Les UUID hallucinees ou\ntronquees ne creent plus silencieusement des worklogs orphelins. Les ids\nlibres sans format UUID (<code>run-145-ci-27</code>, <code>morpheus-life</code>, slugs a prefixe\ncomme <code>29140fb0-team-stats</code>) restent librement creables (design MEGA-1A). Les\nchemins de lecture et de suppression sont inchanges — ils ne creent jamais\nrien.</p>\n","translationsAvailable":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}