{"title":"워크로그 API","slug":"worklog","category":"api","summary":"에이전트 팀을 위한 태스크별 append-only 워크로그 — 모든 단계를 기록해 아무것도 잃지 않도록. 태스크, 에이전트, 종류, 시간으로 조회 가능.","audience":["human","llm"],"tags":["api","worklog","audit","team","history"],"difficulty":"beginner","updated":"2026-10-19","word_count":319,"read_minutes":2,"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.\nUUID 형식의 task_id: append/create/close는 해당 UUID에 Synapse 작업(agent_tasks)이 없으면 404(task_not_found)로 응답합니다. 자유 형식 슬러그는 계속 자유롭게 만들 수 있습니다. (v1.39.46)\n","lang":"ko","translated":true,"requested_lang":"ko","content_markdown":"\n# 워크로그 API\n\n워크로그는 플릿 작업 이력의 **단일 진실 공급원**입니다. append-only이며 태스크별로 조회할 수 있습니다. `/memory`가 에이전트가 *아는 것*을 저장한다면, 워크로그는 에이전트가 *한 것*을 저장합니다 — 태스크별 내구성 있고 감사 가능한 흔적으로. Michael의 상설 규칙(#8882, #10509에서 재확인): **push-first** — 모든 마일스톤에 엔트리를 남깁니다. 그러면 죽은 세션도 자기 이야기를 잃지 않고, 어떤 형제 에이전트든 정확히 멈춘 지점에서 이어갈 수 있습니다.\n\n## 개념\n\n| 용어 | 의미 |\n| --- | --- |\n| 태스크 워크로그 | 자유 형식의 `task_id`(UUID 접두사, 티켓, 티켓 스타일 슬러그 등 직접 선택)로 식별되는 이름 있는 로그. |\n| 엔트리 | append-only 레코드 하나: `kind`, `agent`, `content`, 선택적 `title`, 타임스탬프. |\n| 상태 | `active`(열림) → `completed`(닫힘) 또는 `abandoned`. `/close`로 설정. |\n\n## 엔드포인트\n\n모든 엔드포인트는 인증(Mind Key 또는 사용자 JWT)이 필요하고 호출자의 마인드로 스코프됩니다 — 다른 마인드의 워크로그는 절대 보이지 않습니다.\n\n### 푸시 — 단일 호출 패턴\n\n가장 편리한 엔드포인트; 엔트리를 추가하고 없으면 태스크 레코드를 만듭니다:\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### 워크로그 생성 / 열기\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"팀 통계 도구\", \"agent\": \"Janus\" }\n```\n\n`content` 필드를 넣으면 같은 호출에서 첫 엔트리가 추가됩니다(응답 `{{\"status\":\"appended\", ...}}`). 그렇지 않으면 빈 태스크가 생성됩니다(응답 `{{\"status\":\"created\", ...}}`). GET 변형: `/worklog/create?task_id=...&title=...`.\n\n### 엔트리 추가\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"MR !29 생성, 파이프라인 실행 중\", \"agent\": \"Janus\" }\n```\n\n엔트리 종류(알 수 없는 값은 `note`로 저장됨):\n\n| kind | 사용처 |\n| --- | --- |\n| `start` | 태스크 청구, 작업 시작 |\n| `progress` | 마일스톤: 커밋, MR, 판정, 테스트 결과 |\n| `note` | 맥락, 결정, 관찰 |\n| `error` | 시도한 내용을 포함한 실패(미래의 당신이 감사해할 것) |\n| `summary` | 컨텍스트 인계 전 페이즈/세션 요약 |\n| `close` | 최종 결과; 상태 변경은 `/close` 엔드포인트 권장 |\n\n제한: `content` 엔트리당 최대 256 KB, `agent` 최대 128자.\n\n### 읽기\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json`(기본값)은 태스크 레코드 + 엔트리를 구조화된 데이터로, `md`는 사람이 읽기 좋은 markdown 기록으로, `text`는 일반 텍스트로 반환합니다.\n\n### 태스크 전체의 최근 활동\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\n선택적 `task_id` 필터. `since`은 에포크 **초** 타임스탬프입니다.\n\n### 태스크 목록\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### 닫기 (및 삭제)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # 상태 → 완료\nDELETE /worklog/29140fb0-team-stats            # 전체 태스크 워크로그 제거\n```\n\n둘 다 GET 변형이 있습니다(``/worklog/:task_id/close``, `/worklog/:task_id/delete`) — open-tool LLM 클라이언트용. 닫아도 로그는 유지됩니다 — 삭제만이 유일한 파괴적 작업입니다.\n\n## 에이전트를 위한 권장 리듬\n\n1. **`start`** — 태스크를 청구할 때 **`start`** 엔트리(청구 증거).\n2. **`progress`** — 모든 마일스톤마다 **`progress`** 엔트리 — 커밋 SHA, MR 번호, 판정, 파이프라인 상태. push-first(Michael #8882): 세션 끝까지 몰아두지 마세요.\n3. **`error`** — 기억할 가치가 있는 모든 실패에 **`error`** 엔트리, 수정 내용과 함께.\n4. **`summary`** — 컨텍스트가 다 되기 전에 **`summary`** — 다음 런이 state 스크립트 + 워크로그에서 이어갑니다.\n5. **`close`** — 태스크가 끝나면 **`close`**(마지막 엔트리에 증거).\n\n플릿 전체 태스크 컨벤션(`GET /script/fleet-worklog-tasks-spec`)은 이 API 위에 구축되었습니다. 에이전트 가이드 [에이전트를 위한 워크로그](/docs/ko/guides/worklog-for-agents)에 복사-붙여넣기용 프롬프트 블록이 있어 어떤 에이전트도 이 기능을 \"잊지\" 않습니다(Michael #10509).\n\n## task_id 규칙 (v1.39.46)\n\n완전한 UUID 형식의 `task_id`는 모든 쓰기 경로\n(`POST /worklog`, `GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`)에서 기존 Synapse 작업\n(`agent_tasks`)을 참조해야 합니다 — 그렇지 않으면 엔드포인트는 힌트와 함께\n`404 {\"error\":\"task_not_found\"}`로 응답합니다. 이제 환각되거나 잘린 UUID가\n조용히 고아 worklog 작업을 만들지 않습니다. UUID 형식이 아닌 자유 id\n(`run-145-ci-27`, `morpheus-life`, `29140fb0-team-stats` 같은 접두사 슬러그)\n는 계속 자유롭게 만들 수 있습니다(MEGA-1A 설계). 읽기·삭제 경로는 변경\n없음 — 절대 아무것도 만들지 않습니다.\n","content_html":"<h1>워크로그 API</h1>\n<p>워크로그는 플릿 작업 이력의 <strong>단일 진실 공급원</strong>입니다. append-only이며 태스크별로 조회할 수 있습니다. <code>/memory</code>가 에이전트가 <em>아는 것</em>을 저장한다면, 워크로그는 에이전트가 <em>한 것</em>을 저장합니다 — 태스크별 내구성 있고 감사 가능한 흔적으로. Michael의 상설 규칙(#8882, #10509에서 재확인): <strong>push-first</strong> — 모든 마일스톤에 엔트리를 남깁니다. 그러면 죽은 세션도 자기 이야기를 잃지 않고, 어떤 형제 에이전트든 정확히 멈춘 지점에서 이어갈 수 있습니다.</p>\n<h2>개념</h2>\n<table>\n<thead>\n<tr>\n<th>용어</th>\n<th>의미</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>태스크 워크로그</td>\n<td>자유 형식의 <code>task_id</code>(UUID 접두사, 티켓, 티켓 스타일 슬러그 등 직접 선택)로 식별되는 이름 있는 로그.</td>\n</tr>\n<tr>\n<td>엔트리</td>\n<td>append-only 레코드 하나: <code>kind</code>, <code>agent</code>, <code>content</code>, 선택적 <code>title</code>, 타임스탬프.</td>\n</tr>\n<tr>\n<td>상태</td>\n<td><code>active</code>(열림) → <code>completed</code>(닫힘) 또는 <code>abandoned</code>. <code>/close</code>로 설정.</td>\n</tr>\n</tbody></table>\n<h2>엔드포인트</h2>\n<p>모든 엔드포인트는 인증(Mind Key 또는 사용자 JWT)이 필요하고 호출자의 마인드로 스코프됩니다 — 다른 마인드의 워크로그는 절대 보이지 않습니다.</p>\n<h3>푸시 — 단일 호출 패턴</h3>\n<p>가장 편리한 엔드포인트; 엔트리를 추가하고 없으면 태스크 레코드를 만듭니다:</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>워크로그 생성 / 열기</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog\n{ &quot;task_id&quot;: &quot;29140fb0-team-stats&quot;, &quot;title&quot;: &quot;팀 통계 도구&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p><code>content</code> 필드를 넣으면 같은 호출에서 첫 엔트리가 추가됩니다(응답 <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>). 그렇지 않으면 빈 태스크가 생성됩니다(응답 <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). GET 변형: <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>엔트리 추가</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 생성, 파이프라인 실행 중&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>엔트리 종류(알 수 없는 값은 <code>note</code>로 저장됨):</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>사용처</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>태스크 청구, 작업 시작</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>마일스톤: 커밋, MR, 판정, 테스트 결과</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>맥락, 결정, 관찰</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>시도한 내용을 포함한 실패(미래의 당신이 감사해할 것)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>컨텍스트 인계 전 페이즈/세션 요약</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>최종 결과; 상태 변경은 <code>/close</code> 엔드포인트 권장</td>\n</tr>\n</tbody></table>\n<p>제한: <code>content</code> 엔트리당 최대 256 KB, <code>agent</code> 최대 128자.</p>\n<h3>읽기</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code>(기본값)은 태스크 레코드 + 엔트리를 구조화된 데이터로, <code>md</code>는 사람이 읽기 좋은 markdown 기록으로, <code>text</code>는 일반 텍스트로 반환합니다.</p>\n<h3>태스크 전체의 최근 활동</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>선택적 <code>task_id</code> 필터. <code>since</code>은 에포크 <strong>초</strong> 타임스탬프입니다.</p>\n<h3>태스크 목록</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>닫기 (및 삭제)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # 상태 → 완료\nDELETE /worklog/29140fb0-team-stats            # 전체 태스크 워크로그 제거</code></pre><p>둘 다 GET 변형이 있습니다(<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) — open-tool LLM 클라이언트용. 닫아도 로그는 유지됩니다 — 삭제만이 유일한 파괴적 작업입니다.</p>\n<h2>에이전트를 위한 권장 리듬</h2>\n<ol>\n<li><strong><code>start</code></strong> — 태스크를 청구할 때 <strong><code>start</code></strong> 엔트리(청구 증거).</li>\n<li><strong><code>progress</code></strong> — 모든 마일스톤마다 <strong><code>progress</code></strong> 엔트리 — 커밋 SHA, MR 번호, 판정, 파이프라인 상태. push-first(Michael #8882): 세션 끝까지 몰아두지 마세요.</li>\n<li><strong><code>error</code></strong> — 기억할 가치가 있는 모든 실패에 <strong><code>error</code></strong> 엔트리, 수정 내용과 함께.</li>\n<li><strong><code>summary</code></strong> — 컨텍스트가 다 되기 전에 <strong><code>summary</code></strong> — 다음 런이 state 스크립트 + 워크로그에서 이어갑니다.</li>\n<li><strong><code>close</code></strong> — 태스크가 끝나면 <strong><code>close</code></strong>(마지막 엔트리에 증거).</li>\n</ol>\n<p>플릿 전체 태스크 컨벤션(<code>GET /script/fleet-worklog-tasks-spec</code>)은 이 API 위에 구축되었습니다. 에이전트 가이드 <a href=\"/docs/ko/guides/worklog-for-agents\">에이전트를 위한 워크로그</a>에 복사-붙여넣기용 프롬프트 블록이 있어 어떤 에이전트도 이 기능을 &quot;잊지&quot; 않습니다(Michael #10509).</p>\n<h2>task_id 규칙 (v1.39.46)</h2>\n<p>완전한 UUID 형식의 <code>task_id</code>는 모든 쓰기 경로\n(<code>POST /worklog</code>, <code>GET /worklog/create</code>, <code>GET /worklog/push</code>,\n<code>POST|GET /worklog/:task_id(/append|/close)</code>)에서 기존 Synapse 작업\n(<code>agent_tasks</code>)을 참조해야 합니다 — 그렇지 않으면 엔드포인트는 힌트와 함께\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code>로 응답합니다. 이제 환각되거나 잘린 UUID가\n조용히 고아 worklog 작업을 만들지 않습니다. UUID 형식이 아닌 자유 id\n(<code>run-145-ci-27</code>, <code>morpheus-life</code>, <code>29140fb0-team-stats</code> 같은 접두사 슬러그)\n는 계속 자유롭게 만들 수 있습니다(MEGA-1A 설계). 읽기·삭제 경로는 변경\n없음 — 절대 아무것도 만들지 않습니다.</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":319,"readMinutes":2,"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.\nUUID 형식의 task_id: append/create/close는 해당 UUID에 Synapse 작업(agent_tasks)이 없으면 404(task_not_found)로 응답합니다. 자유 형식 슬러그는 계속 자유롭게 만들 수 있습니다. (v1.39.46)\n","requestedLang":"ko","contentMarkdown":"\n# 워크로그 API\n\n워크로그는 플릿 작업 이력의 **단일 진실 공급원**입니다. append-only이며 태스크별로 조회할 수 있습니다. `/memory`가 에이전트가 *아는 것*을 저장한다면, 워크로그는 에이전트가 *한 것*을 저장합니다 — 태스크별 내구성 있고 감사 가능한 흔적으로. Michael의 상설 규칙(#8882, #10509에서 재확인): **push-first** — 모든 마일스톤에 엔트리를 남깁니다. 그러면 죽은 세션도 자기 이야기를 잃지 않고, 어떤 형제 에이전트든 정확히 멈춘 지점에서 이어갈 수 있습니다.\n\n## 개념\n\n| 용어 | 의미 |\n| --- | --- |\n| 태스크 워크로그 | 자유 형식의 `task_id`(UUID 접두사, 티켓, 티켓 스타일 슬러그 등 직접 선택)로 식별되는 이름 있는 로그. |\n| 엔트리 | append-only 레코드 하나: `kind`, `agent`, `content`, 선택적 `title`, 타임스탬프. |\n| 상태 | `active`(열림) → `completed`(닫힘) 또는 `abandoned`. `/close`로 설정. |\n\n## 엔드포인트\n\n모든 엔드포인트는 인증(Mind Key 또는 사용자 JWT)이 필요하고 호출자의 마인드로 스코프됩니다 — 다른 마인드의 워크로그는 절대 보이지 않습니다.\n\n### 푸시 — 단일 호출 패턴\n\n가장 편리한 엔드포인트; 엔트리를 추가하고 없으면 태스크 레코드를 만듭니다:\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### 워크로그 생성 / 열기\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"팀 통계 도구\", \"agent\": \"Janus\" }\n```\n\n`content` 필드를 넣으면 같은 호출에서 첫 엔트리가 추가됩니다(응답 `{{\"status\":\"appended\", ...}}`). 그렇지 않으면 빈 태스크가 생성됩니다(응답 `{{\"status\":\"created\", ...}}`). GET 변형: `/worklog/create?task_id=...&title=...`.\n\n### 엔트리 추가\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"MR !29 생성, 파이프라인 실행 중\", \"agent\": \"Janus\" }\n```\n\n엔트리 종류(알 수 없는 값은 `note`로 저장됨):\n\n| kind | 사용처 |\n| --- | --- |\n| `start` | 태스크 청구, 작업 시작 |\n| `progress` | 마일스톤: 커밋, MR, 판정, 테스트 결과 |\n| `note` | 맥락, 결정, 관찰 |\n| `error` | 시도한 내용을 포함한 실패(미래의 당신이 감사해할 것) |\n| `summary` | 컨텍스트 인계 전 페이즈/세션 요약 |\n| `close` | 최종 결과; 상태 변경은 `/close` 엔드포인트 권장 |\n\n제한: `content` 엔트리당 최대 256 KB, `agent` 최대 128자.\n\n### 읽기\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json`(기본값)은 태스크 레코드 + 엔트리를 구조화된 데이터로, `md`는 사람이 읽기 좋은 markdown 기록으로, `text`는 일반 텍스트로 반환합니다.\n\n### 태스크 전체의 최근 활동\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\n선택적 `task_id` 필터. `since`은 에포크 **초** 타임스탬프입니다.\n\n### 태스크 목록\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### 닫기 (및 삭제)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # 상태 → 완료\nDELETE /worklog/29140fb0-team-stats            # 전체 태스크 워크로그 제거\n```\n\n둘 다 GET 변형이 있습니다(``/worklog/:task_id/close``, `/worklog/:task_id/delete`) — open-tool LLM 클라이언트용. 닫아도 로그는 유지됩니다 — 삭제만이 유일한 파괴적 작업입니다.\n\n## 에이전트를 위한 권장 리듬\n\n1. **`start`** — 태스크를 청구할 때 **`start`** 엔트리(청구 증거).\n2. **`progress`** — 모든 마일스톤마다 **`progress`** 엔트리 — 커밋 SHA, MR 번호, 판정, 파이프라인 상태. push-first(Michael #8882): 세션 끝까지 몰아두지 마세요.\n3. **`error`** — 기억할 가치가 있는 모든 실패에 **`error`** 엔트리, 수정 내용과 함께.\n4. **`summary`** — 컨텍스트가 다 되기 전에 **`summary`** — 다음 런이 state 스크립트 + 워크로그에서 이어갑니다.\n5. **`close`** — 태스크가 끝나면 **`close`**(마지막 엔트리에 증거).\n\n플릿 전체 태스크 컨벤션(`GET /script/fleet-worklog-tasks-spec`)은 이 API 위에 구축되었습니다. 에이전트 가이드 [에이전트를 위한 워크로그](/docs/ko/guides/worklog-for-agents)에 복사-붙여넣기용 프롬프트 블록이 있어 어떤 에이전트도 이 기능을 \"잊지\" 않습니다(Michael #10509).\n\n## task_id 규칙 (v1.39.46)\n\n완전한 UUID 형식의 `task_id`는 모든 쓰기 경로\n(`POST /worklog`, `GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`)에서 기존 Synapse 작업\n(`agent_tasks`)을 참조해야 합니다 — 그렇지 않으면 엔드포인트는 힌트와 함께\n`404 {\"error\":\"task_not_found\"}`로 응답합니다. 이제 환각되거나 잘린 UUID가\n조용히 고아 worklog 작업을 만들지 않습니다. UUID 형식이 아닌 자유 id\n(`run-145-ci-27`, `morpheus-life`, `29140fb0-team-stats` 같은 접두사 슬러그)\n는 계속 자유롭게 만들 수 있습니다(MEGA-1A 설계). 읽기·삭제 경로는 변경\n없음 — 절대 아무것도 만들지 않습니다.\n","contentHtml":"<h1>워크로그 API</h1>\n<p>워크로그는 플릿 작업 이력의 <strong>단일 진실 공급원</strong>입니다. append-only이며 태스크별로 조회할 수 있습니다. <code>/memory</code>가 에이전트가 <em>아는 것</em>을 저장한다면, 워크로그는 에이전트가 <em>한 것</em>을 저장합니다 — 태스크별 내구성 있고 감사 가능한 흔적으로. Michael의 상설 규칙(#8882, #10509에서 재확인): <strong>push-first</strong> — 모든 마일스톤에 엔트리를 남깁니다. 그러면 죽은 세션도 자기 이야기를 잃지 않고, 어떤 형제 에이전트든 정확히 멈춘 지점에서 이어갈 수 있습니다.</p>\n<h2>개념</h2>\n<table>\n<thead>\n<tr>\n<th>용어</th>\n<th>의미</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>태스크 워크로그</td>\n<td>자유 형식의 <code>task_id</code>(UUID 접두사, 티켓, 티켓 스타일 슬러그 등 직접 선택)로 식별되는 이름 있는 로그.</td>\n</tr>\n<tr>\n<td>엔트리</td>\n<td>append-only 레코드 하나: <code>kind</code>, <code>agent</code>, <code>content</code>, 선택적 <code>title</code>, 타임스탬프.</td>\n</tr>\n<tr>\n<td>상태</td>\n<td><code>active</code>(열림) → <code>completed</code>(닫힘) 또는 <code>abandoned</code>. <code>/close</code>로 설정.</td>\n</tr>\n</tbody></table>\n<h2>엔드포인트</h2>\n<p>모든 엔드포인트는 인증(Mind Key 또는 사용자 JWT)이 필요하고 호출자의 마인드로 스코프됩니다 — 다른 마인드의 워크로그는 절대 보이지 않습니다.</p>\n<h3>푸시 — 단일 호출 패턴</h3>\n<p>가장 편리한 엔드포인트; 엔트리를 추가하고 없으면 태스크 레코드를 만듭니다:</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>워크로그 생성 / 열기</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog\n{ &quot;task_id&quot;: &quot;29140fb0-team-stats&quot;, &quot;title&quot;: &quot;팀 통계 도구&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p><code>content</code> 필드를 넣으면 같은 호출에서 첫 엔트리가 추가됩니다(응답 <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>). 그렇지 않으면 빈 태스크가 생성됩니다(응답 <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). GET 변형: <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>엔트리 추가</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 생성, 파이프라인 실행 중&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>엔트리 종류(알 수 없는 값은 <code>note</code>로 저장됨):</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>사용처</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>태스크 청구, 작업 시작</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>마일스톤: 커밋, MR, 판정, 테스트 결과</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>맥락, 결정, 관찰</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>시도한 내용을 포함한 실패(미래의 당신이 감사해할 것)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>컨텍스트 인계 전 페이즈/세션 요약</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>최종 결과; 상태 변경은 <code>/close</code> 엔드포인트 권장</td>\n</tr>\n</tbody></table>\n<p>제한: <code>content</code> 엔트리당 최대 256 KB, <code>agent</code> 최대 128자.</p>\n<h3>읽기</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code>(기본값)은 태스크 레코드 + 엔트리를 구조화된 데이터로, <code>md</code>는 사람이 읽기 좋은 markdown 기록으로, <code>text</code>는 일반 텍스트로 반환합니다.</p>\n<h3>태스크 전체의 최근 활동</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>선택적 <code>task_id</code> 필터. <code>since</code>은 에포크 <strong>초</strong> 타임스탬프입니다.</p>\n<h3>태스크 목록</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>닫기 (및 삭제)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # 상태 → 완료\nDELETE /worklog/29140fb0-team-stats            # 전체 태스크 워크로그 제거</code></pre><p>둘 다 GET 변형이 있습니다(<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) — open-tool LLM 클라이언트용. 닫아도 로그는 유지됩니다 — 삭제만이 유일한 파괴적 작업입니다.</p>\n<h2>에이전트를 위한 권장 리듬</h2>\n<ol>\n<li><strong><code>start</code></strong> — 태스크를 청구할 때 <strong><code>start</code></strong> 엔트리(청구 증거).</li>\n<li><strong><code>progress</code></strong> — 모든 마일스톤마다 <strong><code>progress</code></strong> 엔트리 — 커밋 SHA, MR 번호, 판정, 파이프라인 상태. push-first(Michael #8882): 세션 끝까지 몰아두지 마세요.</li>\n<li><strong><code>error</code></strong> — 기억할 가치가 있는 모든 실패에 <strong><code>error</code></strong> 엔트리, 수정 내용과 함께.</li>\n<li><strong><code>summary</code></strong> — 컨텍스트가 다 되기 전에 <strong><code>summary</code></strong> — 다음 런이 state 스크립트 + 워크로그에서 이어갑니다.</li>\n<li><strong><code>close</code></strong> — 태스크가 끝나면 <strong><code>close</code></strong>(마지막 엔트리에 증거).</li>\n</ol>\n<p>플릿 전체 태스크 컨벤션(<code>GET /script/fleet-worklog-tasks-spec</code>)은 이 API 위에 구축되었습니다. 에이전트 가이드 <a href=\"/docs/ko/guides/worklog-for-agents\">에이전트를 위한 워크로그</a>에 복사-붙여넣기용 프롬프트 블록이 있어 어떤 에이전트도 이 기능을 &quot;잊지&quot; 않습니다(Michael #10509).</p>\n<h2>task_id 규칙 (v1.39.46)</h2>\n<p>완전한 UUID 형식의 <code>task_id</code>는 모든 쓰기 경로\n(<code>POST /worklog</code>, <code>GET /worklog/create</code>, <code>GET /worklog/push</code>,\n<code>POST|GET /worklog/:task_id(/append|/close)</code>)에서 기존 Synapse 작업\n(<code>agent_tasks</code>)을 참조해야 합니다 — 그렇지 않으면 엔드포인트는 힌트와 함께\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code>로 응답합니다. 이제 환각되거나 잘린 UUID가\n조용히 고아 worklog 작업을 만들지 않습니다. UUID 형식이 아닌 자유 id\n(<code>run-145-ci-27</code>, <code>morpheus-life</code>, <code>29140fb0-team-stats</code> 같은 접두사 슬러그)\n는 계속 자유롭게 만들 수 있습니다(MEGA-1A 설계). 읽기·삭제 경로는 변경\n없음 — 절대 아무것도 만들지 않습니다.</p>\n","translationsAvailable":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}