Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 69 additions & 4 deletions api-reference/on-call.openapi.en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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"
}
}
},
Expand Down Expand Up @@ -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"
}
}
}
Expand Down
73 changes: 69 additions & 4 deletions api-reference/on-call.openapi.zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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"
}
}
},
Expand Down Expand Up @@ -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"
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions api-reference/safari.openapi.en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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": {
Expand Down
12 changes: 12 additions & 0 deletions api-reference/safari.openapi.zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -7448,6 +7448,10 @@
"type": "boolean",
"description": "当存在调用者尚未查看的助手输出时为 true。"
},
"has_open_tasks": {
"type": "boolean",
"description": "会话是否还有未结任务,用于区分「回合已交接」与「会话已完结」。尽力而为:读取失败时该字段不返回(`omitempty`),调用方应视为「未知」,不能据此判定会话空闲。"
},
"current_turn_started_at": {
"type": "integer",
"format": "int64",
Expand Down Expand Up @@ -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": {
Expand Down
2 changes: 1 addition & 1 deletion en/ai-sre/insight.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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/<scope>/automations/<slug>/`), leaving the task prompt as the goal, the delivery, and a pointer to that folder.

<Note>
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."
Expand Down
3 changes: 2 additions & 1 deletion en/ai-sre/sessions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ In a blank AI SRE session, four scenario suggestion cards appear above the compo
<Step title="Search chats">
The search box at the top filters sessions by name. When there are no results, it displays **No matching chats found**.
</Step>
<Step title="Filter by scope / status / activity">
<Step title="Filter by scope / creator / status / activity">
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.
</Step>
</Steps>
Expand All @@ -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 |

Expand Down
8 changes: 7 additions & 1 deletion en/developer/cli.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,13 @@ flashduty incident work-item-assignees-reset <work-item-id> # 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-*)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
Loading
Loading