From 0a5639a2aaac3bf12f51e2a6a9b35ca3b27b7ef4 Mon Sep 17 00:00:00 2001 From: Flashduty AI-SRE Date: Thu, 24 Sep 2026 08:34:01 +0000 Subject: [PATCH] docs(doc-review): daily incremental review 2026-09-24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Diff window 2026-09-23T08:02:03Z..2026-09-23T16:07Z (17 repos). 9 findings: 4 medium, 5 low (0 high). - ai-sre/sessions.mdx: session filter panel gained the 发起人 (creator) dimension - ai-sre/insight.mdx: next-step reco renamed to 'Tested-script automation rewrite' - developer/cli.mdx: work items can now be assigned to AI SRE - api-reference/on-call.openapi.*: port the 5 work-item AI-SRE schema changes into the per-module spec Mintlify actually renders - api-reference/safari.openapi.*: add SessionListRequest.person_ids and SessionItem.has_open_tasks - alert-sources/standard-alert.mdx + keep.mdx: label value limit is 8192 bytes, not 2048 characters - alert-sources/honeycomb.mdx + honeybadger.mdx: document the always-emitted source/check labels --- api-reference/on-call.openapi.en.json | 73 ++++++++++++++++++- api-reference/on-call.openapi.zh.json | 73 ++++++++++++++++++- api-reference/safari.openapi.en.json | 12 +++ api-reference/safari.openapi.zh.json | 12 +++ en/ai-sre/insight.mdx | 2 +- en/ai-sre/sessions.mdx | 3 +- en/developer/cli.mdx | 8 +- .../alert-sources/honeybadger.mdx | 2 + .../alert-sources/honeycomb.mdx | 1 + .../alert-integration/alert-sources/keep.mdx | 2 +- .../alert-sources/standard-alert.mdx | 2 +- zh/ai-sre/insight.mdx | 2 +- zh/ai-sre/sessions.mdx | 3 +- zh/developer/cli.mdx | 8 +- .../alert-sources/honeybadger.mdx | 2 + .../alert-sources/honeycomb.mdx | 1 + .../alert-integration/alert-sources/keep.mdx | 2 +- .../alert-sources/standard-alert.mdx | 2 +- 18 files changed, 192 insertions(+), 18 deletions(-) diff --git a/api-reference/on-call.openapi.en.json b/api-reference/on-call.openapi.en.json index a76fc6d4..e22b5ec5 100644 --- a/api-reference/on-call.openapi.en.json +++ b/api-reference/on-call.openapi.en.json @@ -32590,7 +32590,26 @@ "type": "integer", "format": "int64" }, - "description": "Member IDs of the current assignees. Never null; an empty array means unassigned." + "description": "Member IDs of the current person assignees. AI SRE is not included. Never null; an empty array means no person assignee." + }, + "assignees": { + "description": "Current assignees. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Never null; an empty array means unassigned. `assignee_ids` is the person-only subset of this list.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "type": "array" + }, + "agent_session_id": { + "description": "ID of the AI SRE session executing this item. Omitted when no session is recorded.", + "type": "string" + }, + "agent_session_venue": { + "description": "Where that AI SRE session runs: `web` or `im`. Omitted when no session is recorded.", + "enum": [ + "web", + "im" + ], + "type": "string" }, "created_by": { "type": "integer", @@ -32730,7 +32749,15 @@ "assignee_id": { "type": "integer", "format": "int64", - "description": "Restrict results to items assigned to this member ID. Listing by assignee alone requires being that assignee or an account admin." + "description": "Restrict results to items assigned to this member ID. Listing by assignee alone requires being that assignee or an account admin. Ignored when `assignee_type` is `ai_sre`." + }, + "assignee_type": { + "description": "Filter by assignee type: `person` or `ai_sre`. `ai_sre` returns items assigned to AI SRE (an AI caller uses this to list its own tasks) and does not require `assignee_id`. `person` together with `assignee_id` restricts results to that member. Omitted with a positive `assignee_id` means `person`.", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" }, "cursor": { "type": "string", @@ -32799,7 +32826,15 @@ "type": "integer", "format": "int64" }, - "description": "Initial assignee member IDs. Assignees must be active members who can already read the anchor; assignment never grants access." + "description": "Legacy alias for the initial assignees. Equivalent to `assignees` with every entry `type` `person`. Mutually exclusive with `assignees`: sending both returns an error. Assignees must be active members who can already read the anchor; assignment never grants access." + }, + "assignees": { + "description": "Initial assignees. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Mutually exclusive with `assignee_ids`: sending both returns an error. `assignee_ids` is the legacy alias and is equivalent to an all-`person` list. At most 20 entries. Person assignees must be active members who can already read the anchor; assignment never grants access.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" }, "idempotency_key": { "type": "string", @@ -32973,7 +33008,15 @@ "type": "integer", "format": "int64" }, - "description": "New assignee member IDs, replacing the current set. An empty array clears all assignees." + "description": "Legacy alias for the replacement assignee set. Equivalent to `assignees` with every entry `type` `person`. Mutually exclusive with `assignees`: sending both returns an error. An empty array clears all assignees." + }, + "assignees": { + "description": "Replacement assignee set. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Mutually exclusive with `assignee_ids`: sending both returns an error. `assignee_ids` is the legacy alias and is equivalent to an all-`person` list. At most 20 entries. An empty array clears all assignees.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" } } }, @@ -33627,6 +33670,28 @@ "format": "int64" } } + }, + "WorkItemAssignee": { + "description": "One assignee on a work item.", + "properties": { + "id": { + "description": "Member ID. Required when `type` is `person`. Omitted when `type` is `ai_sre`.", + "format": "int64", + "type": "integer" + }, + "type": { + "description": "Assignee kind: `person` (a member) or `ai_sre` (the account AI SRE).", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" } } } diff --git a/api-reference/on-call.openapi.zh.json b/api-reference/on-call.openapi.zh.json index 3d49ef29..e60907b7 100644 --- a/api-reference/on-call.openapi.zh.json +++ b/api-reference/on-call.openapi.zh.json @@ -32590,7 +32590,26 @@ "type": "integer", "format": "int64" }, - "description": "当前负责人的成员 ID 列表。不会为 null;空数组表示未指派。" + "description": "当前人员负责人的成员 ID。不含 AI SRE。不会为 null;空数组表示没有人员负责人。" + }, + "assignees": { + "description": "当前负责人。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。不会为 null;空数组表示未指派。`assignee_ids` 是其中仅含 `person` 的子集。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "type": "array" + }, + "agent_session_id": { + "description": "执行该事项的 AI SRE 会话 ID。没有会话时省略。", + "type": "string" + }, + "agent_session_venue": { + "description": "该 AI SRE 会话所在位置:`web` 或 `im`。没有会话时省略。", + "enum": [ + "web", + "im" + ], + "type": "string" }, "created_by": { "type": "integer", @@ -32730,7 +32749,15 @@ "assignee_id": { "type": "integer", "format": "int64", - "description": "按负责人成员 ID 过滤结果。仅按负责人查询时,须为本人或账户管理员。" + "description": "按负责人成员 ID 过滤结果。仅按负责人查询时,须为本人或账户管理员。`assignee_type` 为 `ai_sre` 时忽略本字段。" + }, + "assignee_type": { + "description": "按负责人类型过滤:`person` 或 `ai_sre`。`ai_sre` 返回指派给 AI SRE 的事项(AI 用它查询自己的任务),不需要 `assignee_id`。`person` 与 `assignee_id` 一起使用时,只返回该成员负责的事项。省略本字段且 `assignee_id` 为正数时,按 `person` 过滤。", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" }, "cursor": { "type": "string", @@ -32799,7 +32826,15 @@ "type": "integer", "format": "int64" }, - "description": "初始负责人成员 ID 列表。负责人须为已能查看锚定对象的活跃成员;指派不会授予访问权限。" + "description": "初始负责人的旧版别名,等价于全部为 `person` 的 `assignees`。与 `assignees` 互斥,同时出现会报错。负责人须为已能查看锚定对象的活跃成员;指派不会授予访问权限。" + }, + "assignees": { + "description": "初始负责人列表。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。与 `assignee_ids` 互斥,同时出现会报错。`assignee_ids` 是旧版别名,等价于全部为 `person`。最多 20 项。`person` 须为已能查看锚定对象的活跃成员;指派不会授予访问权限。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" }, "idempotency_key": { "type": "string", @@ -32973,7 +33008,15 @@ "type": "integer", "format": "int64" }, - "description": "新的负责人成员 ID 列表,整体替换当前集合。空数组表示清空所有负责人。" + "description": "替换后负责人集合的旧版别名,等价于全部为 `person` 的 `assignees`。与 `assignees` 互斥,同时出现会报错。空数组表示清空所有负责人。" + }, + "assignees": { + "description": "替换后的负责人集合。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。与 `assignee_ids` 互斥,同时出现会报错。`assignee_ids` 是旧版别名,等价于全部为 `person`。最多 20 项。空数组表示清空所有负责人。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" } } }, @@ -33627,6 +33670,28 @@ "format": "int64" } } + }, + "WorkItemAssignee": { + "description": "跟进事项的一名负责人。", + "properties": { + "id": { + "description": "成员 ID。`type` 为 `person` 时必填;`type` 为 `ai_sre` 时省略。", + "format": "int64", + "type": "integer" + }, + "type": { + "description": "负责人类型:`person` 为成员,`ai_sre` 为账户的 AI SRE。", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" } } } diff --git a/api-reference/safari.openapi.en.json b/api-reference/safari.openapi.en.json index 3ede44fa..cf15b330 100644 --- a/api-reference/safari.openapi.en.json +++ b/api-reference/safari.openapi.en.json @@ -7448,6 +7448,10 @@ "type": "boolean", "description": "True when there is assistant output the caller has not yet viewed." }, + "has_open_tasks": { + "type": "boolean", + "description": "Whether the session still has open tasks, used to tell a handed-off turn from a settled session. Best-effort: when the read fails the field is absent (`omitempty`), which callers must treat as \"unknown\", never as proof the session is idle." + }, "current_turn_started_at": { "type": "integer", "format": "int64", @@ -7569,6 +7573,14 @@ }, "description": "Optional explicit team filter; intersects with `scope` and never expands access." }, + "person_ids": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "description": "Filter by who started the session: returns only sessions started by these members (a session is kept when `person_id` matches any of them). Intersects with `scope` and `team_ids`, so it never widens what the caller is allowed to see." + }, "entry_kinds": { "type": "array", "items": { diff --git a/api-reference/safari.openapi.zh.json b/api-reference/safari.openapi.zh.json index 3b78f429..e18c0203 100644 --- a/api-reference/safari.openapi.zh.json +++ b/api-reference/safari.openapi.zh.json @@ -7448,6 +7448,10 @@ "type": "boolean", "description": "当存在调用者尚未查看的助手输出时为 true。" }, + "has_open_tasks": { + "type": "boolean", + "description": "会话是否还有未结任务,用于区分「回合已交接」与「会话已完结」。尽力而为:读取失败时该字段不返回(`omitempty`),调用方应视为「未知」,不能据此判定会话空闲。" + }, "current_turn_started_at": { "type": "integer", "format": "int64", @@ -7569,6 +7573,14 @@ }, "description": "可选的团队过滤;与 `scope` 取交集,且不会扩大访问范围。" }, + "person_ids": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "description": "按会话发起人过滤:只返回由这些成员发起的会话(`person_id` 命中其一即保留)。与 `scope`、`team_ids` 取交集,因此不会让调用方看到本来无权限的会话。" + }, "entry_kinds": { "type": "array", "items": { diff --git a/en/ai-sre/insight.mdx b/en/ai-sre/insight.mdx index afb5b2db..729b553d 100644 --- a/en/ai-sre/insight.mdx +++ b/en/ai-sre/insight.mdx @@ -116,7 +116,7 @@ Friction cards ranked **from highest to lowest importance**, up to approximately About **2–3** forward-looking, grounded suggestions. These are **strategic** (a shift in *how* you work with AI SRE, higher-leverage), distinct from the tactical, file-level fixes in the friction cards; each names the exact observation it's grounded in (a stat from the overview or a friction cluster) and maps to a real AI SRE capability. -When the report surfaces the `expensive-automation` emergent pattern — an automation-entry session that pulls raw listings into context and counts / groups / ranks them itself instead of scripting the aggregation — the next steps include a **Script-first automation rewrite**: ask the agent in chat to rewrite that automation's task prompt script-first, turning the deterministic collection and aggregation into an embedded, tested script. +When the report surfaces the `expensive-automation` emergent pattern — an automation-entry session that pulls raw listings into context and counts / groups / ranks them itself instead of scripting the aggregation — the next steps include a **Tested-script automation rewrite**: ask the agent in chat to move that automation's deterministic collection and aggregation into a tested script under its knowledge folder (`knowledge//automations//`), leaving the task prompt as the goal, the delivery, and a pointer to that folder. Every friction and win must be grounded in at least one real session and carry a verbatim quote as evidence — the report never fabricates sessions, facts, or runbook gaps. If no rankable friction is found, the frictions part displays an empty-state message while the rest of the report still renders — in that case, "the overview itself is the report." diff --git a/en/ai-sre/sessions.mdx b/en/ai-sre/sessions.mdx index 3b67ed6d..025fdde6 100644 --- a/en/ai-sre/sessions.mdx +++ b/en/ai-sre/sessions.mdx @@ -35,7 +35,7 @@ In a blank AI SRE session, four scenario suggestion cards appear above the compo The search box at the top filters sessions by name. When there are no results, it displays **No matching chats found**. - + Click the **Filter** icon in the upper-right corner of the list to open the filter panel and combine the dimensions below. When any non-default filter is active, a small dot appears on the filter button as a reminder. @@ -45,6 +45,7 @@ Dimensions available in the filter panel: | Dimension | Options | Notes | |---|---|---| | Scope | All / Personal / Team | After selecting **Team**, switch between **My teams / Selected teams** (default: **My teams**); only **Selected teams** expands the inline list where you can search and multi-select teams you belong to | +| Creator | All / Started by me / Selected members | Narrows results by who started the session: **Started by me** shows only sessions you created; **Selected members** expands a searchable member list (up to 50 loaded at a time, with distinct empty, no-match, and load-failure states) and keeps sessions started by any of the picked members — picking none is the same as not filtering by creator. This dimension appears only when **Scope** is not **Personal** | | Status | Active / Archived / All | Defaults to showing only **Active** sessions; switch to **Archived** to view archived sessions | | Recent activity | All / 24 hours / 7 days / 30 days | Narrows results by the session's most recent activity time | diff --git a/en/developer/cli.mdx b/en/developer/cli.mdx index bc135366..7d695f59 100644 --- a/en/developer/cli.mdx +++ b/en/developer/cli.mdx @@ -135,7 +135,13 @@ flashduty incident work-item-assignees-reset # Reset the ass flashduty incident work-item-post-mortem-bind [flags] # Bind converted follow-ups to a post-mortem ``` -Key flags for `work-item-create`: `--item-type` (required, `action` or `follow_up`), `--title` (required, up to 512 characters), `--idempotency-key` (required idempotency key, up to 128 characters), `--post-mortem-id` (required for `follow_up`, forbidden for `action`), `--assignee-ids` (initial assignees). Mutating verbs (`update`/`complete`/`convert`/`delete`/`assignees-reset`) require `--version` (optimistic locking — it must match the stored version). +Key flags for `work-item-create`: `--item-type` (required, `action` or `follow_up`), `--title` (required, up to 512 characters), `--idempotency-key` (required idempotency key, up to 128 characters), `--post-mortem-id` (required for `follow_up`, forbidden for `action`), `--assignee-ids` (initial assignees, a legacy alias). Mutating verbs (`update`/`complete`/`convert`/`delete`/`assignees-reset`) require `--version` (optimistic locking — it must match the stored version). + +A work item's assignees can be members or the account's **AI SRE**: + +- `work-item-create` and `work-item-assignees-reset` accept an `assignees` field (each entry shaped `{type, id?}`, where `type` is `person` or `ai_sre`; an `ai_sre` entry carries no `id`, and at most 20 entries are allowed), which can only be passed as JSON via `--data`. `--assignee-ids` is the equivalent legacy alias (an all-`person` list); the two are mutually exclusive and sending both returns an error. +- `work-item-list` gains `--assignee-type person|ai_sre`: `ai_sre` returns items assigned to AI SRE (an AI caller uses it to list its own tasks) and needs no `--assignee-id`, which is ignored in that case; `person` combined with `--assignee-id` returns only that member's items. Omitting the flag with a positive `--assignee-id` filters by `person`. +- In a work item response, `assignee_ids` now holds only the person assignees (AI SRE is not included) and the full list is in `assignees`; items executed by AI SRE also return `agent_session_id` and `agent_session_venue` (`web` or `im`), both omitted when no session is recorded. #### Post-mortem reports (post-mortem-*) diff --git a/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx b/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx index 9fc96743..785a66c1 100644 --- a/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/honeybadger.mdx @@ -111,6 +111,8 @@ Honeybadger events carry no severity, so Flashduty sets the status and severity | Label | Source | | :--- | :--- | +| `source` | Always `honeybadger` | +| `check` | Same as the alert title | | `event` | Event name of this request | | `project` / `project_id` | Honeybadger project name and ID | | `fault_id` | Error ID | diff --git a/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx b/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx index f4a1c41a..7962b476 100644 --- a/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/honeycomb.mdx @@ -185,6 +185,7 @@ When `status` is `OK`, Flashduty recovers the original alert and keeps its last | Label | Source | | :--- | :--- | +| `source` | Always `honeycomb` | | `check` | Trigger name or SLO name | | `alert_type` | `trigger`, `slo_budget_rate`, or `slo_exhaustion_time` | | `alert_id` | Trigger ID or burn alert ID | diff --git a/en/on-call/integration/alert-integration/alert-sources/keep.mdx b/en/on-call/integration/alert-integration/alert-sources/keep.mdx index 3d8fc31e..4afc7abe 100644 --- a/en/on-call/integration/alert-integration/alert-sources/keep.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/keep.mdx @@ -54,7 +54,7 @@ Field|Required|Type|Definition | event_status | Yes | string | Alert status. Enumerated values (`First letter capitalized`): *Critical*: Critical, *Warning*: Warning, *Info*: Info, *Ok*: Recovery. When set to Ok, it indicates automatic recovery of the alert | alert_key | No | string | Alert identifier, used for updating or automatically recovering existing alerts. You can customize this value, but it cannot exceed `255` characters. You can also rely on system-generated values, which will be returned in the response. This value must exist if you're reporting a recovery event | description | No | string | Alert description, maximum `2048` characters, will be truncated if exceeded -| labels | No | map | Alert label collection, where key is the label name and value is the label value. 1. Both label key and value are case-sensitive strings. 2. Label keys should not exceed `128` characters and follow Prometheus label naming conventions. Values should not exceed `2048` characters, will be truncated if exceeded. 3. Maximum `50` labels allowed. See [Standard Alert Best Practices](/en/on-call/integration/alert-integration/alert-sources/standard-alert#iv-best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms" +| labels | No | map | Alert label collection, where key is the label name and value is the label value. 1. Both label key and value are case-sensitive strings. 2. Label keys should not exceed `128` characters and follow Prometheus label naming conventions. Values should not exceed `8192` bytes (8 KB) and are truncated if exceeded; the cut backs off to a UTF-8 character boundary. 3. Maximum `50` labels allowed. See [Standard Alert Best Practices](/en/on-call/integration/alert-integration/alert-sources/standard-alert#iv-best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms" diff --git a/en/on-call/integration/alert-integration/alert-sources/standard-alert.mdx b/en/on-call/integration/alert-integration/alert-sources/standard-alert.mdx index 88a1e9cb..5c1b9b47 100644 --- a/en/on-call/integration/alert-integration/alert-sources/standard-alert.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/standard-alert.mdx @@ -79,7 +79,7 @@ Field|Required|Type|Description | event_status | Yes | string | Alert status. Enumerated values (case-sensitive): *Critical*, *Warning*, *Info*, *Ok*. When specified as Ok, it means automatic recovery of the alert. | alert_key | No | string | Alert identifier, used to update or automatically recover existing alerts. You can customize this value, but it cannot exceed `255` characters. You can also rely on system auto-generation, this value will be returned in the response. If you're reporting a recovery event, this value must exist. | description | No | string | Alert description, no more than `2048` characters, will be truncated if exceeded. -| labels | No | map | Alert label collection, key is the label name, value is the label value. 1. Both key and value of labels are string type, case-sensitive. 2. Label key should not exceed `128` characters, following Prometheus label naming conventions. Value should not exceed `2048` characters, will be truncated if exceeded. 3. Maximum of `50` labels. See `Label Content Reference` in [Best Practices](#best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms" +| labels | No | map | Alert label collection, key is the label name, value is the label value. 1. Both key and value of labels are string type, case-sensitive. 2. Label key should not exceed `128` characters, following Prometheus label naming conventions. Value should not exceed `8192` bytes (8 KB) and is truncated if exceeded; the cut backs off to a UTF-8 character boundary. 3. Maximum of `50` labels. See `Label Content Reference` in [Best Practices](#best-practices). Example: "resource": "171.26.23.22", "check": "api latency > 500ms" | images | No | [][image](#image) | Array of images, used for image display in frontend or Feishu/DingTalk application notifications.The system merged/overwritten based on alt, for the same alt (including empty strings), only one is retained #### image Structure diff --git a/zh/ai-sre/insight.mdx b/zh/ai-sre/insight.mdx index 9b31b3c3..7d74ff01 100644 --- a/zh/ai-sre/insight.mdx +++ b/zh/ai-sre/insight.mdx @@ -116,7 +116,7 @@ sidebarTitle: 使用洞察 约 **2–3 条**面向未来、有据可依的建议。它们是**策略层面**的(在「怎么用 AI SRE」上更高杠杆的转变),区别于摩擦卡片那种逐文件的战术修复;每条都点明它所依据的具体观察(某个总览数字或某一类摩擦),并对应一项真实存在的 AI SRE 能力。 -当报告浮现出 `expensive-automation` 涌现模式——某个自动化(automation)入口的会话把大量原始清单拉进上下文、再由 Agent 自己在上下文里计数 / 分组 / 排名,而不是用脚本完成聚合——下一步建议会给出 **Script-first automation rewrite**:在对话中让 Agent 把该自动化的任务提示改写为脚本优先,把确定性的采集与聚合写成内嵌的、经过测试的脚本。 +当报告浮现出 `expensive-automation` 涌现模式——某个自动化(automation)入口的会话把大量原始清单拉进上下文、再由 Agent 自己在上下文里计数 / 分组 / 排名,而不是用脚本完成聚合——下一步建议会给出 **Tested-script automation rewrite**:在对话中让 Agent 把该自动化确定性的采集与聚合搬进它知识库目录(`knowledge/<范围>/automations//`)下一个经过测试的脚本,任务提示只保留目标、交付方式,以及指向该目录的指引。 每条摩擦与亮点都必须扎根于至少一个真实会话,并配一句逐字引用作为证据——报告不会凭空捏造会话、事实或排查手册缺口。如果没有发现任何可排序的摩擦,摩擦部分会显示一段空状态提示,而其余部分照常呈现——此时「总览本身就是报告」。 diff --git a/zh/ai-sre/sessions.mdx b/zh/ai-sre/sessions.mdx index c0e20178..1a93dbcb 100644 --- a/zh/ai-sre/sessions.mdx +++ b/zh/ai-sre/sessions.mdx @@ -35,7 +35,7 @@ sidebarTitle: 控制台 顶部搜索框按会话名称过滤;无结果时显示 **未找到匹配对话**。 - + 点击列表右上角的 **筛选** 图标打开筛选面板,按下列维度组合过滤;当存在非默认筛选时,筛选按钮上会出现一个小圆点提示。 @@ -45,6 +45,7 @@ sidebarTitle: 控制台 | 维度 | 可选值 | 说明 | |---|---|---| | 范围 | 全部 / 个人 / 团队 | 选择 **团队** 后可在 **我的团队 / 指定团队** 之间切换,默认 **我的团队**;只有切到 **指定团队** 才会展开内联列表,可搜索并多选你所属的团队 | +| 发起人 | 全部 / 我发起的 / 指定成员 | 按会话的创建者收窄结果:**我发起的** 只看你自己创建的会话;**指定成员** 展开可搜索的成员列表(一次最多加载 50 人,列表为空、无匹配和加载失败各有对应提示),命中其中任一成员的会话即保留,一个成员都不选等同于不按发起人过滤。该维度仅在 **范围** 不是 **个人** 时出现 | | 状态 | 活跃 / 归档 / 全部 | 默认仅显示 **活跃** 会话;切到 **归档** 查看已归档会话 | | 最近活动 | 全部 / 24 小时 / 7 天 / 30 天 | 按会话最近一次活动时间收窄结果 | diff --git a/zh/developer/cli.mdx b/zh/developer/cli.mdx index 4b0bc314..a3a79f2b 100644 --- a/zh/developer/cli.mdx +++ b/zh/developer/cli.mdx @@ -135,7 +135,13 @@ flashduty incident work-item-assignees-reset # 重置负责 flashduty incident work-item-post-mortem-bind [flags] # 将已转换的跟进项绑定到复盘 ``` -`work-item-create` 关键参数:`--item-type`(必填,`action` 或 `follow_up`)、`--title`(必填,最多 512 字符)、`--idempotency-key`(必填幂等键,最多 128 字符)、`--post-mortem-id`(`follow_up` 必填,`action` 禁止)、`--assignee-ids`(初始负责人)。更新类操作(`update`/`complete`/`convert`/`delete`/`assignees-reset`)均需传 `--version`(乐观锁,必须与当前存储版本一致)。 +`work-item-create` 关键参数:`--item-type`(必填,`action` 或 `follow_up`)、`--title`(必填,最多 512 字符)、`--idempotency-key`(必填幂等键,最多 128 字符)、`--post-mortem-id`(`follow_up` 必填,`action` 禁止)、`--assignee-ids`(初始负责人,旧别名)。更新类操作(`update`/`complete`/`convert`/`delete`/`assignees-reset`)均需传 `--version`(乐观锁,必须与当前存储版本一致)。 + +工作项的负责人可以是成员,也可以是**本账户的 AI SRE**: + +- `work-item-create` 与 `work-item-assignees-reset` 接受 `assignees` 字段(每项形如 `{type, id?}`,`type` 取 `person` 或 `ai_sre`;`ai_sre` 项不带 `id`,最多 20 项),该字段只能通过 `--data` 传 JSON。`--assignee-ids` 是等价的旧别名(相当于全部为 `person`),两者互斥,同时传会报错。 +- `work-item-list` 新增 `--assignee-type person|ai_sre`:`ai_sre` 返回指派给 AI SRE 的事项(AI 调用方用它列出自己的任务),此时不需要 `--assignee-id`,`--assignee-id` 也会被忽略;`person` 搭配 `--assignee-id` 只返回该成员负责的事项。省略本字段且 `--assignee-id` 为正数时按 `person` 过滤。 +- 工作项响应里的 `assignee_ids` 现在只包含人员负责人(不含 AI SRE),完整负责人列表在 `assignees`;由 AI SRE 执行的事项还会返回 `agent_session_id` 与 `agent_session_venue`(`web` 或 `im`),没有关联会话时这两个字段省略。 #### 复盘报告(post-mortem-*) diff --git a/zh/on-call/integration/alert-integration/alert-sources/honeybadger.mdx b/zh/on-call/integration/alert-integration/alert-sources/honeybadger.mdx index f195c8dd..a991952e 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/honeybadger.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/honeybadger.mdx @@ -111,6 +111,8 @@ Honeybadger 事件不携带等级,Flashduty 按事件名确定状态和等级 | 标签 | 来源 | | :--- | :--- | +| `source` | 固定为 `honeybadger` | +| `check` | 与告警标题一致 | | `event` | 本次推送的事件名 | | `project` / `project_id` | Honeybadger 项目名称和 ID | | `fault_id` | 错误 ID | diff --git a/zh/on-call/integration/alert-integration/alert-sources/honeycomb.mdx b/zh/on-call/integration/alert-integration/alert-sources/honeycomb.mdx index f8c4933e..b6f9d5e6 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/honeycomb.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/honeycomb.mdx @@ -185,6 +185,7 @@ Flashduty 根据 `status` 判断触发或恢复,根据 `severity` 变量确定 | 标签 | 来源 | | :--- | :--- | +| `source` | 固定为 `honeycomb` | | `check` | Trigger 名称或 SLO 名称 | | `alert_type` | `trigger`、`slo_budget_rate` 或 `slo_exhaustion_time` | | `alert_id` | Trigger ID 或 Burn Alert ID | diff --git a/zh/on-call/integration/alert-integration/alert-sources/keep.mdx b/zh/on-call/integration/alert-integration/alert-sources/keep.mdx index 77dd5812..bde41516 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/keep.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/keep.mdx @@ -55,7 +55,7 @@ keywords: ["告警集成", "Keep 告警集成指引", "监控告警", "数据接 | event_status | 是 | string | 告警状态。

枚举值(`首字母大写`):*Critical*:严重,*Warning*:警告,*Info*:提醒,*Ok*:恢复。

当指定为Ok时,意味着对告警进行自动恢复。 | alert_key | 否 | string | 告警标识,用于对已经存在的告警进行更新或自动恢复。

您可以自定义此值,但不可超过`255`个字符。您也可以依赖系统自动生成,该值会在响应中返回。

如果您上报的是恢复事件,则此值必须存在。 | description | 否 | string | 告警描述,不超过`2048`个字符,超出后将自动截断。 -| labels | 否 | map | 告警标签集合,key 为标签名称,value 为标签值:

1. 标签的 key 和 value 均为 string 类型,区分大小写。
2. 标签的 key 不要超过`128`个字符,遵循Prometheus标签命名规范。value 不超过`2048`个字符,超出后将自动截断。
3. 至多传入`50`个标签。请参考[标准告警最佳实践](/zh/on-call/integration/alert-integration/alert-sources/standard-alert#四、最佳实践)。

示例:"resource": "171.26.23.22", "check": "api latency > 500ms" +| labels | 否 | map | 告警标签集合,key 为标签名称,value 为标签值:

1. 标签的 key 和 value 均为 string 类型,区分大小写。
2. 标签的 key 不要超过`128`个字符,遵循Prometheus标签命名规范。value 不超过`8192`字节(即 8 KB),超出后将自动截断,截断会回退到 UTF-8 字符边界,不会截出半个汉字。
3. 至多传入`50`个标签。请参考[标准告警最佳实践](/zh/on-call/integration/alert-integration/alert-sources/standard-alert#四、最佳实践)。

示例:"resource": "171.26.23.22", "check": "api latency > 500ms" diff --git a/zh/on-call/integration/alert-integration/alert-sources/standard-alert.mdx b/zh/on-call/integration/alert-integration/alert-sources/standard-alert.mdx index 4aa1af2b..a2e3c53e 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/standard-alert.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/standard-alert.mdx @@ -75,7 +75,7 @@ POST, Content-Type:"application/json" | event_status | 是 | string | 告警状态。枚举值(`首字母大写`):*Critical*:严重,*Warning*:警告,*Info*:提醒,*Ok*:恢复。当指定为Ok时,意味着对告警进行自动恢复。 | alert_key | 否 | string | 告警标识,用于对已经存在的告警进行更新或自动恢复。您可以自定义此值,但不可超过`255`个字符。您也可以依赖系统自动生成,该值会在响应中返回。如果您上报的是恢复事件,则此值必须存在。 | description | 否 | string | 告警描述,不超过`2048`个字符,超出后将自动截断。 -| labels | 否 | map | 告警标签集合,key 为标签名称,value 为标签值。1. 标签的 key 和 value 均为 string 类型,区分大小写。2. 标签的 key 不要超过`128`个字符,遵循Prometheus标签命名规范。value 不超过`2048`个字符,超出后将自动截断。3. 至多传入`50`个标签。`标签内容参考`[最佳实践](#最佳实践)。示例:"resource": "171.26.23.22", "check": "api latency > 500ms" +| labels | 否 | map | 告警标签集合,key 为标签名称,value 为标签值。1. 标签的 key 和 value 均为 string 类型,区分大小写。2. 标签的 key 不要超过`128`个字符,遵循Prometheus标签命名规范。value 不超过`8192`字节(即 8 KB),超出后将自动截断,截断会回退到 UTF-8 字符边界,不会截出半个汉字。3. 至多传入`50`个标签。`标签内容参考`[最佳实践](#最佳实践)。示例:"resource": "171.26.23.22", "check": "api latency > 500ms" | images | 否 | [][image](#image) | 图片数组,可用于前端或飞书和钉钉应用通知的图片展示。系统根据 alt 进行合并覆盖,相同(包括空字符)的alt只保留一条 #### image 结构体