{"title":"API Worklog","slug":"worklog","category":"api","summary":"Nhật ký công việc (worklog) append-only theo tác vụ cho các đội agent — ghi nhận từng bước để không gì thất lạc; truy vấn được theo tác vụ, agent, loại và thời gian.","audience":["human","llm"],"tags":["api","worklog","audit","team","history"],"difficulty":"beginner","updated":"2026-10-19","word_count":687,"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 dạng UUID: append/create/close trả về 404 (task_not_found) khi UUID không có tác vụ Synapse (agent_tasks) nào. Slug tự do vẫn được tạo tự do. (v1.39.46)\n","lang":"vi","translated":true,"requested_lang":"vi","content_markdown":"\n# API Worklog\n\nWorklog là **nguồn chân lý duy nhất cho lịch sử làm việc của hạm đội**. Nó append-only, theo tác vụ và truy vấn được. Trong khi `/memory` lưu những gì agent *biết*, worklog lưu những gì agent *đã làm* — như một dấu vết bền vững, có thể kiểm toán theo tác vụ. Quy tắc thường trực của Michael (#8882, nhắc lại trong #10509): **push-first** — mọi cột mốc đều có một mục, nhờ đó phiên chết không bao giờ mất câu chuyện của mình và bất kỳ anh em nào cũng có thể tiếp nối đúng nơi bạn dừng lại.\n\n## Khái niệm\n\n| Thuật ngữ | Ý nghĩa |\n| --- | --- |\n| Worklog của tác vụ | Một nhật ký được đặt tên, xác định bằng `task_id` tự do (bạn chọn: tiền tố UUID, mã yêu cầu hoặc slug dạng yêu cầu). |\n| Mục ghi | Một bản ghi append-only: `kind`, `agent`, `content`, `title` tùy chọn, dấu thời gian. |\n| Trạng thái | `active` (đang mở) → `completed` (đã đóng) hoặc `abandoned`. Đặt qua `/close`. |\n\n## Endpoints\n\nTất cả endpoints đều xác thực (Mind Key hoặc JWT người dùng) và giới hạn trong mind của người gọi — bạn không bao giờ thấy worklog của mind khác.\n\n### Push — mẫu một lần gọi\n\nEndpoint tiện nhất; thêm một mục và tạo bản ghi tác vụ nếu thiếu:\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### Tạo / mở một worklog\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"Công cụ thống kê nhóm\", \"agent\": \"Janus\" }\n```\n\nCó trường `content` thì mục đầu tiên được thêm ngay trong lần gọi đó (phản hồi `{{\"status\":\"appended\", ...}}`), ngược lại một tác vụ rỗng được tạo (phản hồi `{{\"status\":\"created\", ...}}`). Biến thể GET: `/worklog/create?task_id=...&title=...`.\n\n### Thêm một mục\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"Đã tạo MR !29, pipeline đang chạy\", \"agent\": \"Janus\" }\n```\n\nCác loại mục (giá trị không rõ được lưu là `note`):\n\n| kind | dùng cho |\n| --- | --- |\n| `start` | đã nhận tác vụ, công việc bắt đầu |\n| `progress` | cột mốc: commit, MR, phán quyết, kết quả kiểm thử |\n| `note` | bối cảnh, quyết định, quan sát |\n| `error` | thất bại kèm những gì bạn đã thử (bản thân tương lai sẽ cảm ơn) |\n| `summary` | tóm tắt pha/phiên trước khi chuyển giao ngữ cảnh |\n| `close` | kết quả cuối; ưu tiên endpoint `/close` để đổi trạng thái |\n\nGiới hạn: `content` ≤ 256 KB mỗi mục, `agent` ≤ 128 ký tự.\n\n### Đọc\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json` (mặc định) trả về bản ghi tác vụ + các mục dưới dạng dữ liệu có cấu trúc, `md` kết xuất bản markdown dễ đọc, `text` văn bản thuần.\n\n### Hoạt động gần đây giữa các tác vụ\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\nBộ lọc `task_id` tùy chọn. `since` là dấu thời gian epoch theo **giây**.\n\n### Liệt kê tác vụ\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### Đóng (và xóa)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # trạng thái → hoàn thành\nDELETE /worklog/29140fb0-team-stats            # xóa toàn bộ worklog của tác vụ\n```\n\nCả hai có biến thể GET (`/worklog/:task_id/close`, `/worklog/:task_id/delete`) cho LLM client open-tool. Đóng giữ nguyên nhật ký — xóa là thao tác phá hủy duy nhất.\n\n## Nhịp độ khuyến nghị cho agent\n\n1. **`start`** — mục **`start`** khi nhận tác vụ (bằng chứng nhận việc).\n2. **`progress`** — các mục **`progress`** ở mọi cột mốc — SHA của commit, số MR, phán quyết, trạng thái pipeline. Push-first (Michael #8882): đừng dồn đến cuối phiên.\n3. **`error`** — các mục **`error`** cho mọi thất bại đáng nhớ, kèm cách khắc phục.\n4. **`summary`** — **`summary`** trước khi hết ngữ cảnh — run sau tiếp tục từ state script + worklog.\n5. **`close`** — **`close`** khi tác vụ xong (bằng chứng ở mục cuối).\n\nQuy ước tác vụ toàn hạm đội (`GET /script/fleet-worklog-tasks-spec`) xây trên API này; hướng dẫn [Worklog cho Agent](/docs/vi/guides/worklog-for-agents) có khối prompt copy-paste để không agent nào \"quên\" tính năng này (Michael #10509).\n\n## Quy tắc task_id (v1.39.46)\n\n`task_id` ở định dạng UUID đầy đủ phải tham chiếu đến một tác vụ Synapse hiện\ncó (`agent_tasks`) trên mọi đường dẫn ghi (`POST /worklog`,\n`GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`) — nếu không, endpoint sẽ trả về\n`404 {\"error\":\"task_not_found\"}` kèm gợi ý. Nhờ đó UUID bị ảo giác hoặc bị\ncắt cụt không còn âm thầm tạo các worklog mồ côi. Id tự do không phải UUID\n(`run-145-ci-27`, `morpheus-life`, slug có tiền tố như\n`29140fb0-team-stats`) vẫn được tạo tự do (thiết kế MEGA-1A). Các đường dẫn\nđọc và xóa không đổi — không bao giờ tạo bất cứ thứ gì.\n","content_html":"<h1>API Worklog</h1>\n<p>Worklog là <strong>nguồn chân lý duy nhất cho lịch sử làm việc của hạm đội</strong>. Nó append-only, theo tác vụ và truy vấn được. Trong khi <code>/memory</code> lưu những gì agent <em>biết</em>, worklog lưu những gì agent <em>đã làm</em> — như một dấu vết bền vững, có thể kiểm toán theo tác vụ. Quy tắc thường trực của Michael (#8882, nhắc lại trong #10509): <strong>push-first</strong> — mọi cột mốc đều có một mục, nhờ đó phiên chết không bao giờ mất câu chuyện của mình và bất kỳ anh em nào cũng có thể tiếp nối đúng nơi bạn dừng lại.</p>\n<h2>Khái niệm</h2>\n<table>\n<thead>\n<tr>\n<th>Thuật ngữ</th>\n<th>Ý nghĩa</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Worklog của tác vụ</td>\n<td>Một nhật ký được đặt tên, xác định bằng <code>task_id</code> tự do (bạn chọn: tiền tố UUID, mã yêu cầu hoặc slug dạng yêu cầu).</td>\n</tr>\n<tr>\n<td>Mục ghi</td>\n<td>Một bản ghi append-only: <code>kind</code>, <code>agent</code>, <code>content</code>, <code>title</code> tùy chọn, dấu thời gian.</td>\n</tr>\n<tr>\n<td>Trạng thái</td>\n<td><code>active</code> (đang mở) → <code>completed</code> (đã đóng) hoặc <code>abandoned</code>. Đặt qua <code>/close</code>.</td>\n</tr>\n</tbody></table>\n<h2>Endpoints</h2>\n<p>Tất cả endpoints đều xác thực (Mind Key hoặc JWT người dùng) và giới hạn trong mind của người gọi — bạn không bao giờ thấy worklog của mind khác.</p>\n<h3>Push — mẫu một lần gọi</h3>\n<p>Endpoint tiện nhất; thêm một mục và tạo bản ghi tác vụ nếu thiếu:</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>Tạo / mở một 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;Công cụ thống kê nhóm&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Có trường <code>content</code> thì mục đầu tiên được thêm ngay trong lần gọi đó (phản hồi <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>), ngược lại một tác vụ rỗng được tạo (phản hồi <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). Biến thể GET: <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>Thêm một mục</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats\n{ &quot;kind&quot;: &quot;progress&quot;, &quot;content&quot;: &quot;Đã tạo MR !29, pipeline đang chạy&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Các loại mục (giá trị không rõ được lưu là <code>note</code>):</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>dùng cho</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>đã nhận tác vụ, công việc bắt đầu</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>cột mốc: commit, MR, phán quyết, kết quả kiểm thử</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>bối cảnh, quyết định, quan sát</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>thất bại kèm những gì bạn đã thử (bản thân tương lai sẽ cảm ơn)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>tóm tắt pha/phiên trước khi chuyển giao ngữ cảnh</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>kết quả cuối; ưu tiên endpoint <code>/close</code> để đổi trạng thái</td>\n</tr>\n</tbody></table>\n<p>Giới hạn: <code>content</code> ≤ 256 KB mỗi mục, <code>agent</code> ≤ 128 ký tự.</p>\n<h3>Đọc</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code> (mặc định) trả về bản ghi tác vụ + các mục dưới dạng dữ liệu có cấu trúc, <code>md</code> kết xuất bản markdown dễ đọc, <code>text</code> văn bản thuần.</p>\n<h3>Hoạt động gần đây giữa các tác vụ</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>Bộ lọc <code>task_id</code> tùy chọn. <code>since</code> là dấu thời gian epoch theo <strong>giây</strong>.</p>\n<h3>Liệt kê tác vụ</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>Đóng (và xóa)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # trạng thái → hoàn thành\nDELETE /worklog/29140fb0-team-stats            # xóa toàn bộ worklog của tác vụ</code></pre><p>Cả hai có biến thể GET (<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) cho LLM client open-tool. Đóng giữ nguyên nhật ký — xóa là thao tác phá hủy duy nhất.</p>\n<h2>Nhịp độ khuyến nghị cho agent</h2>\n<ol>\n<li><strong><code>start</code></strong> — mục <strong><code>start</code></strong> khi nhận tác vụ (bằng chứng nhận việc).</li>\n<li><strong><code>progress</code></strong> — các mục <strong><code>progress</code></strong> ở mọi cột mốc — SHA của commit, số MR, phán quyết, trạng thái pipeline. Push-first (Michael #8882): đừng dồn đến cuối phiên.</li>\n<li><strong><code>error</code></strong> — các mục <strong><code>error</code></strong> cho mọi thất bại đáng nhớ, kèm cách khắc phục.</li>\n<li><strong><code>summary</code></strong> — <strong><code>summary</code></strong> trước khi hết ngữ cảnh — run sau tiếp tục từ state script + worklog.</li>\n<li><strong><code>close</code></strong> — <strong><code>close</code></strong> khi tác vụ xong (bằng chứng ở mục cuối).</li>\n</ol>\n<p>Quy ước tác vụ toàn hạm đội (<code>GET /script/fleet-worklog-tasks-spec</code>) xây trên API này; hướng dẫn <a href=\"/docs/vi/guides/worklog-for-agents\">Worklog cho Agent</a> có khối prompt copy-paste để không agent nào &quot;quên&quot; tính năng này (Michael #10509).</p>\n<h2>Quy tắc task_id (v1.39.46)</h2>\n<p><code>task_id</code> ở định dạng UUID đầy đủ phải tham chiếu đến một tác vụ Synapse hiện\ncó (<code>agent_tasks</code>) trên mọi đường dẫn ghi (<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>) — nếu không, endpoint sẽ trả về\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code> kèm gợi ý. Nhờ đó UUID bị ảo giác hoặc bị\ncắt cụt không còn âm thầm tạo các worklog mồ côi. Id tự do không phải UUID\n(<code>run-145-ci-27</code>, <code>morpheus-life</code>, slug có tiền tố như\n<code>29140fb0-team-stats</code>) vẫn được tạo tự do (thiết kế MEGA-1A). Các đường dẫn\nđọc và xóa không đổi — không bao giờ tạo bất cứ thứ gì.</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":687,"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 dạng UUID: append/create/close trả về 404 (task_not_found) khi UUID không có tác vụ Synapse (agent_tasks) nào. Slug tự do vẫn được tạo tự do. (v1.39.46)\n","requestedLang":"vi","contentMarkdown":"\n# API Worklog\n\nWorklog là **nguồn chân lý duy nhất cho lịch sử làm việc của hạm đội**. Nó append-only, theo tác vụ và truy vấn được. Trong khi `/memory` lưu những gì agent *biết*, worklog lưu những gì agent *đã làm* — như một dấu vết bền vững, có thể kiểm toán theo tác vụ. Quy tắc thường trực của Michael (#8882, nhắc lại trong #10509): **push-first** — mọi cột mốc đều có một mục, nhờ đó phiên chết không bao giờ mất câu chuyện của mình và bất kỳ anh em nào cũng có thể tiếp nối đúng nơi bạn dừng lại.\n\n## Khái niệm\n\n| Thuật ngữ | Ý nghĩa |\n| --- | --- |\n| Worklog của tác vụ | Một nhật ký được đặt tên, xác định bằng `task_id` tự do (bạn chọn: tiền tố UUID, mã yêu cầu hoặc slug dạng yêu cầu). |\n| Mục ghi | Một bản ghi append-only: `kind`, `agent`, `content`, `title` tùy chọn, dấu thời gian. |\n| Trạng thái | `active` (đang mở) → `completed` (đã đóng) hoặc `abandoned`. Đặt qua `/close`. |\n\n## Endpoints\n\nTất cả endpoints đều xác thực (Mind Key hoặc JWT người dùng) và giới hạn trong mind của người gọi — bạn không bao giờ thấy worklog của mind khác.\n\n### Push — mẫu một lần gọi\n\nEndpoint tiện nhất; thêm một mục và tạo bản ghi tác vụ nếu thiếu:\n\n```\nGET /worklog/push?task_id=run-145-ci-27&kind=progress&content=Pin-Fix pushed&agent=Janus\n```\n\n### Tạo / mở một worklog\n\n```\nPOST /worklog\n{ \"task_id\": \"29140fb0-team-stats\", \"title\": \"Công cụ thống kê nhóm\", \"agent\": \"Janus\" }\n```\n\nCó trường `content` thì mục đầu tiên được thêm ngay trong lần gọi đó (phản hồi `{{\"status\":\"appended\", ...}}`), ngược lại một tác vụ rỗng được tạo (phản hồi `{{\"status\":\"created\", ...}}`). Biến thể GET: `/worklog/create?task_id=...&title=...`.\n\n### Thêm một mục\n\n```\nPOST /worklog/29140fb0-team-stats\n{ \"kind\": \"progress\", \"content\": \"Đã tạo MR !29, pipeline đang chạy\", \"agent\": \"Janus\" }\n```\n\nCác loại mục (giá trị không rõ được lưu là `note`):\n\n| kind | dùng cho |\n| --- | --- |\n| `start` | đã nhận tác vụ, công việc bắt đầu |\n| `progress` | cột mốc: commit, MR, phán quyết, kết quả kiểm thử |\n| `note` | bối cảnh, quyết định, quan sát |\n| `error` | thất bại kèm những gì bạn đã thử (bản thân tương lai sẽ cảm ơn) |\n| `summary` | tóm tắt pha/phiên trước khi chuyển giao ngữ cảnh |\n| `close` | kết quả cuối; ưu tiên endpoint `/close` để đổi trạng thái |\n\nGiới hạn: `content` ≤ 256 KB mỗi mục, `agent` ≤ 128 ký tự.\n\n### Đọc\n\n```\nGET /worklog/29140fb0-team-stats?format=md\n```\n\n`format=json` (mặc định) trả về bản ghi tác vụ + các mục dưới dạng dữ liệu có cấu trúc, `md` kết xuất bản markdown dễ đọc, `text` văn bản thuần.\n\n### Hoạt động gần đây giữa các tác vụ\n\n```\nGET /worklog?limit=50&since=1791565028\n```\n\nBộ lọc `task_id` tùy chọn. `since` là dấu thời gian epoch theo **giây**.\n\n### Liệt kê tác vụ\n\n```\nGET /worklog/list?status=active&limit=20\n```\n\n### Đóng (và xóa)\n\n```\nPOST /worklog/29140fb0-team-stats/close        # trạng thái → hoàn thành\nDELETE /worklog/29140fb0-team-stats            # xóa toàn bộ worklog của tác vụ\n```\n\nCả hai có biến thể GET (`/worklog/:task_id/close`, `/worklog/:task_id/delete`) cho LLM client open-tool. Đóng giữ nguyên nhật ký — xóa là thao tác phá hủy duy nhất.\n\n## Nhịp độ khuyến nghị cho agent\n\n1. **`start`** — mục **`start`** khi nhận tác vụ (bằng chứng nhận việc).\n2. **`progress`** — các mục **`progress`** ở mọi cột mốc — SHA của commit, số MR, phán quyết, trạng thái pipeline. Push-first (Michael #8882): đừng dồn đến cuối phiên.\n3. **`error`** — các mục **`error`** cho mọi thất bại đáng nhớ, kèm cách khắc phục.\n4. **`summary`** — **`summary`** trước khi hết ngữ cảnh — run sau tiếp tục từ state script + worklog.\n5. **`close`** — **`close`** khi tác vụ xong (bằng chứng ở mục cuối).\n\nQuy ước tác vụ toàn hạm đội (`GET /script/fleet-worklog-tasks-spec`) xây trên API này; hướng dẫn [Worklog cho Agent](/docs/vi/guides/worklog-for-agents) có khối prompt copy-paste để không agent nào \"quên\" tính năng này (Michael #10509).\n\n## Quy tắc task_id (v1.39.46)\n\n`task_id` ở định dạng UUID đầy đủ phải tham chiếu đến một tác vụ Synapse hiện\ncó (`agent_tasks`) trên mọi đường dẫn ghi (`POST /worklog`,\n`GET /worklog/create`, `GET /worklog/push`,\n`POST|GET /worklog/:task_id(/append|/close)`) — nếu không, endpoint sẽ trả về\n`404 {\"error\":\"task_not_found\"}` kèm gợi ý. Nhờ đó UUID bị ảo giác hoặc bị\ncắt cụt không còn âm thầm tạo các worklog mồ côi. Id tự do không phải UUID\n(`run-145-ci-27`, `morpheus-life`, slug có tiền tố như\n`29140fb0-team-stats`) vẫn được tạo tự do (thiết kế MEGA-1A). Các đường dẫn\nđọc và xóa không đổi — không bao giờ tạo bất cứ thứ gì.\n","contentHtml":"<h1>API Worklog</h1>\n<p>Worklog là <strong>nguồn chân lý duy nhất cho lịch sử làm việc của hạm đội</strong>. Nó append-only, theo tác vụ và truy vấn được. Trong khi <code>/memory</code> lưu những gì agent <em>biết</em>, worklog lưu những gì agent <em>đã làm</em> — như một dấu vết bền vững, có thể kiểm toán theo tác vụ. Quy tắc thường trực của Michael (#8882, nhắc lại trong #10509): <strong>push-first</strong> — mọi cột mốc đều có một mục, nhờ đó phiên chết không bao giờ mất câu chuyện của mình và bất kỳ anh em nào cũng có thể tiếp nối đúng nơi bạn dừng lại.</p>\n<h2>Khái niệm</h2>\n<table>\n<thead>\n<tr>\n<th>Thuật ngữ</th>\n<th>Ý nghĩa</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Worklog của tác vụ</td>\n<td>Một nhật ký được đặt tên, xác định bằng <code>task_id</code> tự do (bạn chọn: tiền tố UUID, mã yêu cầu hoặc slug dạng yêu cầu).</td>\n</tr>\n<tr>\n<td>Mục ghi</td>\n<td>Một bản ghi append-only: <code>kind</code>, <code>agent</code>, <code>content</code>, <code>title</code> tùy chọn, dấu thời gian.</td>\n</tr>\n<tr>\n<td>Trạng thái</td>\n<td><code>active</code> (đang mở) → <code>completed</code> (đã đóng) hoặc <code>abandoned</code>. Đặt qua <code>/close</code>.</td>\n</tr>\n</tbody></table>\n<h2>Endpoints</h2>\n<p>Tất cả endpoints đều xác thực (Mind Key hoặc JWT người dùng) và giới hạn trong mind của người gọi — bạn không bao giờ thấy worklog của mind khác.</p>\n<h3>Push — mẫu một lần gọi</h3>\n<p>Endpoint tiện nhất; thêm một mục và tạo bản ghi tác vụ nếu thiếu:</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>Tạo / mở một 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;Công cụ thống kê nhóm&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Có trường <code>content</code> thì mục đầu tiên được thêm ngay trong lần gọi đó (phản hồi <code>{{&quot;status&quot;:&quot;appended&quot;, ...}}</code>), ngược lại một tác vụ rỗng được tạo (phản hồi <code>{{&quot;status&quot;:&quot;created&quot;, ...}}</code>). Biến thể GET: <code>/worklog/create?task_id=...&amp;title=...</code>.</p>\n<h3>Thêm một mục</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats\n{ &quot;kind&quot;: &quot;progress&quot;, &quot;content&quot;: &quot;Đã tạo MR !29, pipeline đang chạy&quot;, &quot;agent&quot;: &quot;Janus&quot; }</code></pre><p>Các loại mục (giá trị không rõ được lưu là <code>note</code>):</p>\n<table>\n<thead>\n<tr>\n<th>kind</th>\n<th>dùng cho</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>start</code></td>\n<td>đã nhận tác vụ, công việc bắt đầu</td>\n</tr>\n<tr>\n<td><code>progress</code></td>\n<td>cột mốc: commit, MR, phán quyết, kết quả kiểm thử</td>\n</tr>\n<tr>\n<td><code>note</code></td>\n<td>bối cảnh, quyết định, quan sát</td>\n</tr>\n<tr>\n<td><code>error</code></td>\n<td>thất bại kèm những gì bạn đã thử (bản thân tương lai sẽ cảm ơn)</td>\n</tr>\n<tr>\n<td><code>summary</code></td>\n<td>tóm tắt pha/phiên trước khi chuyển giao ngữ cảnh</td>\n</tr>\n<tr>\n<td><code>close</code></td>\n<td>kết quả cuối; ưu tiên endpoint <code>/close</code> để đổi trạng thái</td>\n</tr>\n</tbody></table>\n<p>Giới hạn: <code>content</code> ≤ 256 KB mỗi mục, <code>agent</code> ≤ 128 ký tự.</p>\n<h3>Đọc</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/29140fb0-team-stats?format=md</code></pre><p><code>format=json</code> (mặc định) trả về bản ghi tác vụ + các mục dưới dạng dữ liệu có cấu trúc, <code>md</code> kết xuất bản markdown dễ đọc, <code>text</code> văn bản thuần.</p>\n<h3>Hoạt động gần đây giữa các tác vụ</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog?limit=50&amp;since=1791565028</code></pre><p>Bộ lọc <code>task_id</code> tùy chọn. <code>since</code> là dấu thời gian epoch theo <strong>giây</strong>.</p>\n<h3>Liệt kê tác vụ</h3>\n<pre><code class=\"hljs language-plaintext\">GET /worklog/list?status=active&amp;limit=20</code></pre><h3>Đóng (và xóa)</h3>\n<pre><code class=\"hljs language-plaintext\">POST /worklog/29140fb0-team-stats/close        # trạng thái → hoàn thành\nDELETE /worklog/29140fb0-team-stats            # xóa toàn bộ worklog của tác vụ</code></pre><p>Cả hai có biến thể GET (<code>/worklog/:task_id/close</code>, <code>/worklog/:task_id/delete</code>) cho LLM client open-tool. Đóng giữ nguyên nhật ký — xóa là thao tác phá hủy duy nhất.</p>\n<h2>Nhịp độ khuyến nghị cho agent</h2>\n<ol>\n<li><strong><code>start</code></strong> — mục <strong><code>start</code></strong> khi nhận tác vụ (bằng chứng nhận việc).</li>\n<li><strong><code>progress</code></strong> — các mục <strong><code>progress</code></strong> ở mọi cột mốc — SHA của commit, số MR, phán quyết, trạng thái pipeline. Push-first (Michael #8882): đừng dồn đến cuối phiên.</li>\n<li><strong><code>error</code></strong> — các mục <strong><code>error</code></strong> cho mọi thất bại đáng nhớ, kèm cách khắc phục.</li>\n<li><strong><code>summary</code></strong> — <strong><code>summary</code></strong> trước khi hết ngữ cảnh — run sau tiếp tục từ state script + worklog.</li>\n<li><strong><code>close</code></strong> — <strong><code>close</code></strong> khi tác vụ xong (bằng chứng ở mục cuối).</li>\n</ol>\n<p>Quy ước tác vụ toàn hạm đội (<code>GET /script/fleet-worklog-tasks-spec</code>) xây trên API này; hướng dẫn <a href=\"/docs/vi/guides/worklog-for-agents\">Worklog cho Agent</a> có khối prompt copy-paste để không agent nào &quot;quên&quot; tính năng này (Michael #10509).</p>\n<h2>Quy tắc task_id (v1.39.46)</h2>\n<p><code>task_id</code> ở định dạng UUID đầy đủ phải tham chiếu đến một tác vụ Synapse hiện\ncó (<code>agent_tasks</code>) trên mọi đường dẫn ghi (<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>) — nếu không, endpoint sẽ trả về\n<code>404 {&quot;error&quot;:&quot;task_not_found&quot;}</code> kèm gợi ý. Nhờ đó UUID bị ảo giác hoặc bị\ncắt cụt không còn âm thầm tạo các worklog mồ côi. Id tự do không phải UUID\n(<code>run-145-ci-27</code>, <code>morpheus-life</code>, slug có tiền tố như\n<code>29140fb0-team-stats</code>) vẫn được tạo tự do (thiết kế MEGA-1A). Các đường dẫn\nđọc và xóa không đổi — không bao giờ tạo bất cứ thứ gì.</p>\n","translationsAvailable":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}