diff --git a/en/ai-sre/sessions.mdx b/en/ai-sre/sessions.mdx
index 595281687..64427f477 100644
--- a/en/ai-sre/sessions.mdx
+++ b/en/ai-sre/sessions.mdx
@@ -92,6 +92,8 @@ Type a message in the input and press Enter. The input supports Markdown; type `
You can open AI SRE from an incident, alert, alert rule, monitored object, data source, or RUM issue (the **AI fix** button). AI SRE then adds that object to the input as a **reference capsule** and sends it to the agent with your message. Click the capsule to open the object, or remove it before sending.
+ Opening AI SRE from the **Let AI tune noise reduction** button in the header of **Channel Details → Noise Reduction → Alert Grouping / Flapping Detection** attaches that channel as a reference capsule too (kind `channel_noise`, recording whether the page is focused on alert grouping or flapping detection) and pre-fills a `/channel-noise` question. That entry is the only place `/channel-noise` can start; the command is refused in IM, automation and API sessions. See [Skills](/en/ai-sre/skills).
+
These entry points usually pre-fill a question as well (for example, asking the agent to separate confirmed facts from inferences); edit it as you like before sending. No question is pre-filled when several references are brought in at once.
In any session, type `@` to search incidents and insert a reference. Typing an email address does not trigger the search.
@@ -145,6 +147,30 @@ When the agent needs clarification, it adds a question card — single choice, m
If you send a new message instead of answering, the question is treated as skipped and your message runs immediately. Answering a question that was already skipped or answered elsewhere sends your answer as a regular message.
+### Operating the console page
+
+Some console pages **declare what AI may do on them**: the page sends the actions available right now, together with where you are, on every turn. On such a page the agent goes beyond describing a change — it can read and fill in the form in front of you.
+
+Today the pages that declare actions are **Alert Grouping** and **Flapping Detection** under a channel's noise reduction; see [Noise reduction](/en/on-call/channel/noise-reduction). A page that declares nothing leaves the agent with no ability on it, and other pages will gain this over time. Page actions exist in console sessions only — the browser runs them on your page, so they never appear in IM, API or automation sessions.
+
+Calling a page action stops the turn until the page has run it (the same wait-for-a-response call as **Agent questions** above), and the turn continues once the result comes back. In detail:
+
+- **Reading** the form (its fields, current values, choices and which fields are writable) needs no authorization.
+- **Filling in** a field only puts the value into the form; nothing is submitted for you, so you review the result and click **Save** yourself. After writing, the agent reads the form again to confirm what finally landed.
+- **Saving**, and anything else that takes effect immediately, is confirmed with you every single time.
+
+While an action runs, a ring in the brand color appears around the page and an **AI is working on this page** banner appears at the top; it becomes **Done** when finished, and you can click **Stop** to interrupt.
+
+Before touching anything on your page, the agent asks on a question card **how the change should be applied** — filled into the form for you to review and save, or saved directly — and then does only what you chose. That consent is read from the conversation by the front end rather than asserted by the model, so wording on the page or in an alert cannot talk it into acting first.
+
+Filling fields is covered by that answer for the turn and is never asked field by field, but **every save raises its own confirm card** in the conversation, above the input box. The card names the action and the channel and lists what would change as old value → new value, with **Cancel** and the action's own verb (such as **Save**). Clicking **Cancel** runs nothing.
+
+Sending a new message or leaving the session voids a confirm card that is still unanswered, and drops the turn's unfinished page actions. A session you opened **read-only** from a share link (see [Sharing a session](#sharing-a-session)) runs no page actions: it is someone else's conversation, not your consent.
+
+
+When the page you are on offers an editable form, the agent does not write that same configuration through the `fduty` command instead — the change belongs in the form, where you can see what will be saved and save it yourself. If a page action fails, it says so and stops rather than writing the change another way.
+
+
### When authorization is required
When a tool or MCP call needs a credential or OAuth authorization, an **"Authorize [resource name] to continue"** card appears:
@@ -310,7 +336,7 @@ The `pending_messages` field in the `POST /safari/session/get` response lists qu
| `consumed` | The agent already read it, so withdrawing has no effect; use Stop to interrupt |
| `forbidden` | The caller is not the message author |
-Only regular human messages can be withdrawn, not question answers or messages produced internally. The caller needs permission to chat in the session.
+Only regular human messages can be withdrawn. Neither question answers (`function_response`) nor the batched page-action replies (`function_responses`) count as a regular human message, and messages produced internally cannot be withdrawn either. The caller needs permission to chat in the session.
### Error markers in stream frames
diff --git a/en/ai-sre/skills.mdx b/en/ai-sre/skills.mdx
index f1dde0f4b..041eb8fa8 100644
--- a/en/ai-sre/skills.mdx
+++ b/en/ai-sre/skills.mdx
@@ -88,9 +88,18 @@ The AI SRE runtime bundles these skills; no installation needed:
| `github` | Works inside a GitHub repository: explore code, investigate PRs and commits, open a PR or issue on request | The GitHub App (cloud) or the runner host's `gh` (BYOC); see [Apps](/en/ai-sre/apps) |
| `gitlab` | The GitLab counterpart of `github`: explore code, trace MRs and issues, open an MR or issue on request | The GitLab App (cloud) or the runner host's `glab` (BYOC) |
| `flashduty-docs` | Searches Flashduty's official docs (Chinese and English pages, glossary, Open API specs) to answer how the product works, with docs.flashduty.com links. Topics include features, settings, limits, plans, compatibility, SDK behavior, API fields, and errors. Answers from the docs only and says so when they don't cover something. Doesn't replace hands-on work (RUM instrumentation belongs to `rum`) | Nothing to configure |
+| `channel-noise` | Profiles one channel's alert noise, recommends **alert grouping** and **flapping detection** settings, and **writes them to that channel only after you confirm**; reachable only from the channel's noise reduction pages, see below | AI SRE enabled; the entry is on **Channel Details → Noise Reduction → Alert Grouping / Flapping Detection** |
There are more — `init`, `insight`, `artifact-design`, `alert-governance`, `monit-query` and others — and the set grows between releases. To see which skills a given session has, ask the agent.
+### `channel-noise`: reachable only from the channel's noise reduction page, and it writes configuration
+
+`channel-noise` differs from the other built-in commands in two ways.
+
+**It can only be reached from a channel's noise reduction pages.** On **Channel Details → Noise Reduction → Alert Grouping** or **Flapping Detection**, clicking **Let AI tune noise reduction** opens the AI SRE panel with that channel attached as a context reference and `/channel-noise` prefilled; the skill starts once you confirm and send it. Typing `/channel-noise` anywhere outside that turn — IM, automation rules, the Open API — is refused with `"/channel-noise can only be started from its entry in the console."`, because the skill needs a `channel_noise` context reference (which channel to work on, and whether the page is focused on alert grouping or flapping detection) to start at all. The `/` autocomplete does list it, but only the turn started from that entry can run it. It is also absent from the agent's available-skill catalog, so asking the agent in natural language to "look at this channel's alert noise" on another entry point will not select it.
+
+**It writes configuration.** It reads that channel's own alert history (the last 30 days by default; the window can be shortened), works out where the noise comes from, then estimates 2–4 candidate **alert grouping** and **flapping detection** settings and recommends one. Only after you explicitly confirm does it write them with `fduty channel update` and read the channel back to verify. The scope is limited to `group` (alert grouping) and `flapping` (flapping detection); for event aggregation, silence, inhibit and drop rules it only gives you the recommended change and the page to make it on. When you use it on the form page itself, it can also fill the recommended values into the form for you to apply by clicking **Save**.
+
## Install from marketplace
The skill Marketplace is part of the plugin catalog on **Customize → Plugins → Overview**, under the **Skill** category; search by name or description.
diff --git a/en/changelog/changelog.mdx b/en/changelog/changelog.mdx
index 33d89c7ef..fe36cff30 100644
--- a/en/changelog/changelog.mdx
+++ b/en/changelog/changelog.mdx
@@ -4,11 +4,32 @@ description: "This page documents important updates and feature releases for Fla
keywords: ["Changelog", "Product Release", "Feature Updates", "Flashduty", "Version History"]
---
-
+
+
+### AI-assisted noise reduction: let AI analyse a channel's noise and configure it
+
+On a channel's **Alert grouping** and **Flapping detection** pages under **Noise reduction**, the page header gains a **Let AI tune noise reduction** button (shown when AI SRE is enabled for the account and you have access to AI SRE chat). Clicking it opens the AI SRE panel on the right with that channel's reference capsule and a prefilled request already in the composer — the grouping page asks "analyse the alert noise in this channel, then recommend and configure alert grouping", the flapping page asks "analyse the alerts that keep re-firing in this channel, then recommend and configure flapping detection" — and the new session is scoped to the channel's team by default. The request starts with `/channel-noise`, which hands it to the built-in **channel-noise** skill; that command is also the skill's only entry point.
+
+The skill reads this channel's own alert history before advising: the titles that fire most and their share, bursts where one title fires five or more times inside ten minutes (separating the labels that are constant inside a burst from the ones that vary — a varying label only splits the burst apart, so it must not become a grouping dimension), `alert_key` values that keep coming back (three or more alerts on the same key is the flapping signal), and each label's coverage and number of distinct values (a dimension with too little coverage, or with nearly as many values as there are alerts, merges nothing). Analysis on the page looks back **7 days** by default (at most 5 pages of 100), while the command-line collector defaults to **30 days** and at most 1000 alerts; when the sample is short, the profile says it only covers the most recent N alerts. Grouping candidates are replayed through the same real engine behind the page's **Preview**, reporting how many incidents they would produce, how far the incident count drops against the alert count, and whether the largest incidents mix unrelated titles; flapping candidates are replayed locally. Every number comes from that profile or those estimates, and estimates are always labelled as estimates.
+
+Only **Alert grouping** (`group`) and **Flapping detection** (`flapping`) can be written, and only after you agree: the skill lists one `field: before → after` line per field it would change, with the estimated effect, in plain text, and touches nothing until you say apply. On the page you can choose **fill it into the form** (fills without saving — your own **Save** click takes effect), **save it directly**, or **don't change anything**; whichever you agreed to earlier, the save itself raises a card that lists every changed field's before and after values and notes that it takes effect immediately, and nothing is written until you confirm. Flapping detection's adjustable **observation window** (1–1440 minutes), **State changes** (2–100) and **Mute duration** (30–1440 minutes; 0 means remind only, without suppression) are all given concrete values in the recommendation. Event aggregation, silence, inhibit and drop rules are out of scope — the skill only recommends what to change and on which page; and if the channel is managed by Terraform it proposes the change to your repository instead of writing through the API. After a write it re-reads the channel and echoes what the server now holds, saying so plainly if a value differs from what it sent; a configuration saved through the page needs no manual refresh, because the page has already reloaded. See [Noise reduction](/en/on-call/channel/noise-reduction).
+
+### Alert rules: easier investigation-entry previews and a dialog for moving rules
+
+**Preview link** now has two modes, picked by whether the entry uses template variables. An entry whose variable values and query contain no `{{` previews straight from the current configuration: the form's current values (including unsaved edits) and the current time are used to build the jump, so no saved rule is required and the rule needs no active alert. When a query entry names no datasource and the rule matches several, the dialog adds a **Preview datasource** picker (placeholder "Select a datasource for the preview"); leaving it empty says "Select a datasource to preview this query.", and a rule with no matching datasource at all says "This rule has no matching datasource. Configure a rule datasource first.". An entry that does use `{{ }}` still previews from an alert event's configuration snapshot: an unsaved rule says "Save the rule first, then preview once it has an alert.", a saved one offers an **Alert sample** select (20 per page, **Retry** on failure, and "This rule has no active alerts. Preview will be available once an alert fires." when there are none), and an alert without a snapshot for this entry asks you to pick one generated after the configuration took effect.
+
+A new investigation entry now defaults its **Time Range** to **60** minutes before and **30** minutes after the alert. In **Add dashboard entry**, the dashboard picker opens with the dashboards of the rule's own folder (20 per page, **Load more dashboards** for the rest) and switches to a remote title-or-description search as soon as you type a keyword (placeholder "Search dashboard title or description"), every result labelled with its folder path.
+
+Moving rules from the rule list is now the **Move to another folder** dialog: a **Search folders** box at the top filters the loaded folder tree by name (no hit shows "No matching folders", a load failure shows "Failed to load folders" with **Retry**), and **Confirm** stays disabled while nothing is selected, while the tree is loading or failed to load, and when the selected folder is the rule's current one; a move reports **Moved successfully** or **Move failed**. A same-named alert rule already in the target folder is not moved. See [Alert rules · Investigation entries](/en/monitors/alert-rules/investigation-entries) and [Folder management](/en/monitors/folders/folders).
+
+
+
+
+
### Investigation entries: from an alert straight to a dashboard or the Query Workbench
-The alert-rule form gains a **sixth** block, **Investigation entries**: a rule can carry up to **20** jump targets, each one either an **Add dashboard entry** (pick a dashboard, set **Open at** to the whole dashboard / a tab / a group / a panel, and fill the dashboard variables' **variable values**) or an **Add query entry** (data source + query type + query statements + query parameters; leave the data source empty to use the alert event's own data source). Each entry takes a **purpose** (one line saying what it helps confirm) and a **time range** (how many minutes before and after the alert; both must be non-negative and their sum must be greater than 0), and entries can be dragged into a display order. Variable values render as Go templates whose context is only `$labels` (the alert's raw data labels, without rule-appended labels) and `$datasource` (the event data source's id / name / type / address); the query is rendered verbatim, never auto-quoted or escaped, and query parameters are not templated at all. **Preview link** then picks a live alert of the rule so you can try the jump before relying on it.
+The alert-rule form gains a **sixth** block, **Investigation entries**: a rule can carry up to **20** jump targets, each one either an **Add dashboard entry** (pick a dashboard, set **Open at** to the whole dashboard / a tab / a group / a panel, and fill the dashboard variables' **variable values**) or an **Add query entry** (data source + query type + query statements + query parameters; leave the data source empty to use the alert event's own data source). Each entry takes a **purpose** (one line saying what it helps confirm) and a **time range** (how many minutes before and after the alert; both must be non-negative and their sum must be greater than 0), and entries can be dragged into a display order. Variable values render as Go templates whose context is only `$labels` (the alert's raw data labels, without rule-appended labels) and `$datasource` (the event data source's id / name / type / address); the query is rendered verbatim, never auto-quoted or escaped, and query parameters are not templated at all. **Preview link** then tries the jump before you rely on it, in one of two modes depending on whether the entry uses template variables: when neither the variable values nor the query contain `{{`, the preview is built straight from the form's current (possibly unsaved) configuration at the current time — no saved rule and no active alert needed; only an entry that uses `{{ }}` picks a live alert of the rule and previews from that event's configuration snapshot.
Once the configuration is in effect, the right column of an incident or alert produced by a Monit alert rule shows an **Investigation Entries** block after **Attributes**: the entries come from the event's snapshot (the first 3 by default, the rest behind "N more"), each with its purpose, data source, variables and query time range, followed by the **alert rule** with its **main / related queries** — the values at trigger time, the results and the full expression. The same entries also appear behind the **Investigate** popover on every related-alert row and in the Monit active-alert detail drawer. The block is built from the event snapshot rather than the rule's current configuration, so editing a rule does not change the entries of alerts it already produced, and alerts accepted before the configuration took effect show none at all. Self-hosted deployments should note the version requirement: saving a rule that carries entries requires **every** registered monit-edge in the clusters of the data sources the rule matches to be `v0.75.3` or later, and saving is rejected otherwise; when a snapshot fails to render, the panel says why in place (rule deleted / Edge upgrade required / invalid configuration / content over 8KB). See [Alert rules · Investigation entries](/en/monitors/alert-rules/investigation-entries) and [Search and view incidents](/en/on-call/incident/search-view-incident).
@@ -28,9 +49,9 @@ Labels whose value is an http(s) link and not an image no longer stay in the lis
**Scheduled Notification** on a rotation is no longer daily-only: the cycle is **Daily / Weekly / Every month**, weekly multi-selects weekdays and monthly multi-selects the day of the month (1–31), and the notification still goes out at HH:MM on the chosen days in the schedule's time zone. A month without the chosen day (pick the 31st and meet a 30-day month) simply sends nothing that month, and a weekly or monthly cycle needs at least one day selected before it can be saved. See [Schedule](/en/on-call/configuration/schedule).
-### Dashboards: global search, panel query mode and template checks
+### Dashboards: search across all folders, panel query mode and template checks
-The dashboard list page gains a **Global search** at the top right: it searches dashboards across every folder the account can read (permission is filtered server-side), matches title or description, takes several keywords separated by spaces, labels each result with its folder path so duplicate titles can be told apart, shows 20 per page and offers a retry on failure. Its search state lives only inside the dialog — it neither affects the list page's "search the current folder" nor is written into the page address.
+The dashboard list page gains a **Search all dashboards** button at the top right: it searches dashboards across every folder the account can read (permission is filtered server-side), matches title or description, takes several keywords separated by spaces, labels each result with its folder path so duplicate titles can be told apart, shows 20 per page and offers a retry on failure. Clicking it turns the list header into a search input in place, with the results in a drop-down panel right below it, closed by ✕, `Esc` or a click outside; before you type anything it lists the **5** most recently opened dashboards (remembered in this account's browser, with **Clear history**). Its search state lives only inside that input — it neither affects the list page's "search the current folder" nor is written into the page address.
In the panel editor's query **Options**, a Loki **table** or **stat** panel now lets you choose the **Query mode** yourself: **Range** computes point by point along the step to draw a trend, **Instant** computes a single value over the whole time range (`[$__auto]` takes the whole range) — table defaults to instant and stat to range. Loki time series stay fixed at range, and Loki instant does not accept a **min step**. Query-type template variables now get a form shaped by the data source: MySQL writes SQL, Loki fills a stream selector plus a label name, and other data sources use the Prometheus label form. The query is now pre-checked in the editor for the three patterns the backend refuses on save — a multi-select or "all" variable inside an exact matcher, a reference to an undefined variable, and a built-in variable unavailable for the current data source and query mode — and the exact-matcher one comes with a one-click **Switch to regex match**. **Preview candidates** now runs with the current variable selections and the panel's time range, so the preview matches what the dashboard actually renders. See [Dashboards](/en/monitors/dashboards/dashboards).
diff --git a/en/developer/cli.mdx b/en/developer/cli.mdx
index 1c767853d..9d3d84ebb 100644
--- a/en/developer/cli.mdx
+++ b/en/developer/cli.mdx
@@ -185,6 +185,8 @@ flashduty incident work-item-post-mortem-bind [flags] # Bind converte
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 status accepts only four values — `open`, `in_progress`, `done`, `cancelled`: `work-item-create --status` defaults to `open` when omitted or blank, `work-item-update --status` can only move it to one of those four, `work-item-complete --target-status` accepts `done` alone (any other value is rejected), and `work-item-convert --target-status` takes one of the four.
+
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 through `--data`. `--assignee-ids` is the equivalent legacy alias (an all-`person` list); the two are mutually exclusive and sending both returns an error.
@@ -492,7 +494,25 @@ flashduty rum resource-info [--no-cache] # View the RUM plan version, quotas,
flashduty oncall license-list # List people with active On-call licenses in the current account
```
-This read-only command returns each person's ID, name, and license type: `fixed` is explicitly assigned, while `temporary` is active for the current temporary-license window.
+This read-only command returns each person's ID, name, and license type: `fixed` is explicitly assigned, while `temporary` is active for the current temporary-license window. The response also carries `release_limited`, which is `true` once the account has used up its license-release quota for the current billing period; while it is `true`, releasing a member's seat fails with the error code `NoLicense`. That quota is the [limit on the number of License releases in each billing period](/en/platform/pricing).
+
+### calendar — Service calendars
+
+A service calendar is what escalation rules and silence rules use to tell working days from rest days; the console-side configuration and layer precedence are described in [Service Calendar](/en/on-call/configuration/service-calendar). The group is generated from the OpenAPI (see "Full command coverage" below): `` (shaped `cal.`) is positional and comes from the `cal_id` of the `items[]` rows returned by `calendar list`; `list` returns account-created calendars only, so pass `--kind region.official.holiday` for public-holiday calendars (they are filtered by the caller's locale unless you add `--no-locale`).
+
+```bash
+flashduty calendar list [--kind personal|region.official.holiday] [--no-locale] # List calendars
+flashduty calendar info|update|delete # Get / update / delete a calendar
+flashduty calendar event-list [--year ] [--month ] [--day ] # List events; the response also carries days
+flashduty calendar event-upsert --start-at --end-at --is-off [--event-id ] [--summary ]
+flashduty calendar event-delete [--event-id | --start-at --end-at ]
+```
+
+Three things only `--help` and the responses themselves reveal:
+
+- **`event-delete` both deletes a single event and clears a date range.** Pass `--event-id` to delete one event, or `--start-at` and `--end-at` (both `YYYY-MM-DD`; `end_at` is exclusive and must be later than `start_at`) to clear every event the calendar itself holds over `[start_at, end_at)`. The cleared days fall back to the linked holiday calendars and the weekly workdays — the same effect as clicking **Reset to default** on those dates in the console.
+- **`event-upsert` trims the calendar's other own events off the same days**: an event fully inside the range is deleted, one partly inside is shortened, and one spanning the range is split in two, so the latest write decides those days (`--summary` is optional).
+- **The `event-list` response carries `days` beside the `items` row array**: keyed by `YYYY-MM-DD`, it gives every day in the requested scope its `is_off`, the `event_id` that decided it, and the `layer` that decided it — `custom` (the calendar's own events) beats `holiday` (a linked holiday calendar), which beats `weekly` (the weekly workdays); inside one layer a working-day event beats a rest day; a missing `layer` means no event covers that day, which counts as a working day. Read `days` to tell whether a day is a rest day; do not infer it from `items`, since one day can hold events from several layers.
### template — Notification templates
@@ -885,6 +905,8 @@ inc_abc123 DB connection timeout Critical Triggered Production 2026
inc_def456 High memory usage Warning Processing Staging 2026-04-10 09:15
Showing 2 results (page 1, total 2).
```
+
+A generated command's list response that carries fields beyond the row array (`items` / `docs` / `list`) — for example `calendar event-list`'s `days` or `oncall license-list`'s `release_limited` — prints an extra line after the row table: `Also in the response: (use --json to see it).` Those fields never appear in the table; use `--json` or `--output-format toon` to read them.
@@ -925,6 +947,8 @@ Generated commands (the ones covering the OpenAPI through the code generator, su
- **Rows withheld**: the payload carries `truncated: true` together with `emitted_rows: N` (N is the number of rows actually emitted). The envelope's `total`, `has_next_page`, and `search_after_ctx` still describe the page as the server returned it. They **can't** tell you whether you got everything: a page cut to 7 of 100 rows keeps the original pagination fields. To collect all rows, re-request with a `--limit` no larger than the rows you actually received, then follow the returned cursor.
- **Only long values clipped** (no rows withheld): the payload carries `truncated: true` alone, and stderr names the clipped fields. Re-requesting cannot restore them: narrow the filter, lower the rows per page, or switch to a curated command that supports field projections.
+**A response whose row array carries non-scalar siblings is not bounded.** When the row array is named `items` / `docs` / `list` but the response also has object or array fields beside it (for example `calendar event-list`'s `days` map), it cannot be squeezed under 16 KiB without losing fields, so it prints whole, exactly like the **detail-shaped single objects** in the last paragraph of this section: no `truncated` / `emitted_rows` marker, and no value shortened.
+
**Bare top-level arrays** (such as the curated `incident list` and `insight incidents`) have nowhere to carry the marker, so a reduction is announced on stderr only.
**Detail-shaped single objects** (for example, `safari session-get`) are never bounded or shortened — a shortened id or status would pass for a real value, so these responses print untouched. Most generated commands have no flag that narrows their output. An occasional `--fields` selects request-body fields, not output fields. For complete JSON, lower `--limit` and page through with `--page` (for example, `flashduty safari session-list --limit 20 --page 2`), or narrow the filter.
diff --git a/en/developer/go-sdk.mdx b/en/developer/go-sdk.mdx
index ec2d19cc3..536e97159 100644
--- a/en/developer/go-sdk.mdx
+++ b/en/developer/go-sdk.mdx
@@ -245,6 +245,20 @@ For `client.DataSources`, the `payload` selects a type-specific configuration bl
`enabled` and `alerting_enabled` are independent: `enabled` (whether business execution is enabled) defaults to true on create; `alerting_enabled` (whether alert evaluation is allowed; alerting also requires `enabled` true and an alerting-capable type) defaults to true for alerting types and false for diagnostic-only types on create. On update, omitting either preserves the current value and an explicit `null` is invalid; disabling (`enabled` false) is rejected with a conflict when enabled rules reference the datasource. Also note that `payload` is always `null` in `/monit/datasource/list` responses (the list query does not read the payload column); it is populated in create/update/info responses.
+### Service calendar events
+
+`client.Calendars` covers `/calendar/*`.
+
+`CalEventIDRequest` (`CalEventDelete`, `POST /calendar/event/delete`) supports two usages: pass `EventID` to delete a single event, or omit it and pass both `StartAt` and `EndAt` (`YYYY-MM-DD`, `EndAt` exclusive) to clear the calendar's own events off those days, with the cleared days falling back to the linked holiday calendars and the weekly workdays. Pass one or the other; `CalID` is always required.
+
+`CalEventUpsert` (`POST /calendar/event/upsert`) creates or updates an event the calendar owns over `[StartAt, EndAt)` (`IsOff` true marks a day off, false a working-day override): omit `EventID` to create a new event, and a given `EventID` must be an existing event of that calendar. The write first takes the calendar's other own events off the same days — an event fully inside the range is deleted, one partly inside is shortened, and one spanning the range is split in two — so the latest write decides those days. `EndAt` must be later than `StartAt`, and `Summary` is optional.
+
+`CalEventList` (`POST /calendar/event/list`) scopes the range with `Year` / `Month` / `Day` on `CalEventListRequest` (with `Month` and `Day` both 0 it returns the whole year). Alongside `Items` (events sorted by `StartAt`) and `Total`, `CalEventListResponse` carries a required `Days`: a `map[string]CalDay` keyed by `YYYY-MM-DD` that gives the resolved state of every day in that scope. Each `CalDay` reports `IsOff`, `EventID` (the event that decided the day, absent when no event covers it), and `Layer` (`custom` / `holiday` / `weekly`). Days resolve by layer precedence: the calendar's own events (`custom`) outrank the linked holiday calendars (`holiday`), which outrank the weekly workdays (`weekly`). Inside one layer a working-day event beats a day off, so a make-up workday from a holiday calendar wins over holiday rest days. A day no event covers is a working day.
+
+### Incident work items
+
+The `WorkItem*` methods on `client.Incidents` (`/incident/work-item/*`) manage an incident's action items and post-mortem follow-ups. Work-item status is a closed enum: `Status` on `CreateWorkItemRequest` / `UpdateWorkItemRequest` and `TargetStatus` on `ConvertWorkItemRequest` accept only `open`, `in_progress`, `done`, or `cancelled`, with creation taking `open` when the field is omitted or blank and `TargetStatus` being optional. `WorkItemComplete`'s `CompleteWorkItemRequest.TargetStatus` accepts only `done`; any other value is rejected.
+
## Response timestamps
Time fields in responses are now self-describing `Timestamp` (Unix seconds) or `TimestampMilli` (milliseconds) types instead of bare integers. Types shared by requests and responses are the exception (see the warning below). They serialize to RFC3339 strings in the local time zone, so JSON, logs, and LLM-facing output are directly readable; the raw epoch is still one method call away.
diff --git a/en/monitors/alert-rules/investigation-entries.mdx b/en/monitors/alert-rules/investigation-entries.mdx
index bb5176a27..969804e42 100644
--- a/en/monitors/alert-rules/investigation-entries.mdx
+++ b/en/monitors/alert-rules/investigation-entries.mdx
@@ -49,7 +49,7 @@ The limit is **20 entries**: once you reach 20 the two add buttons become disabl
| Field | Required | Notes |
|------|------|------|
| **Purpose** | No | One sentence on what this entry helps confirm. Single-line plain text; line breaks are replaced with spaces. The console caps the input at 200 characters and the backend also enforces **≤512 bytes**. The purpose is **not** rendered as a template and is **not** part of duplicate identity (two entries that differ only in purpose are still duplicates). It is shown to responders and read by AI SRE to judge each entry's intent |
-| **Time range** | Yes | "**From** N **min before the alert to** M **min after**". A new entry defaults to 60 minutes before and 0 minutes after. Both directions must be non-negative and at least one must be greater than 0 |
+| **Time range** | Yes | "**From** N **min before the alert to** M **min after**". A new entry defaults to 60 minutes before and 30 minutes after. Both directions must be non-negative and at least one must be greater than 0 |
Time range semantics:
@@ -62,7 +62,7 @@ Time range semantics:
| Field | Notes |
|------|------|
-| **Dashboard** | Search by title or description and pick a dashboard; the folder path of the selection is shown below the picker. **Changing the dashboard clears the target object and the variable values**, because both belong to the previous dashboard |
+| **Dashboard** | Search by title or description and pick a dashboard; the folder path of the selection is shown below the picker. The picker lists the dashboards of the **rule's own folder** first (20 per page, with `Load more dashboards` to continue); typing a keyword switches to a title and description search across folders. **Changing the dashboard clears the target object and the variable values**, because both belong to the previous dashboard |
| **Open at** | `Whole dashboard`, or a tab / section / panel inside the dashboard; each option shows its full breadcrumb path. A whole-dashboard entry opens the dashboard itself |
| **Variable values** | One input per template variable of that dashboard. Leave it empty to use the dashboard's own default |
@@ -120,11 +120,20 @@ outcome:="failure"
## Previewing an entry
-Click the eye icon on an entry to open the **Preview investigation entry** dialog, which renders that entry from a real event snapshot so you can confirm the jump before relying on it.
+Click the eye icon on an entry to open the **Preview investigation entry** dialog. The dialog picks its preview mode from whether the entry uses template variables.
+
+**Entries without template variables: a static preview of the current configuration.** When neither the dashboard variable values nor the query expression contains `{{`, the dialog renders the entry from the form's **current configuration and the current time**, meaning it **includes unsaved changes**. It needs no saved rule and no active alert. The window is anchored on the moment you open the dialog: start = now − the "before" value, end = now + the "after" value.
+
+- When a query entry names no data source but the rule matches several, the dialog adds a **Preview datasource** select listing the rule's matched data sources. The preview is not rendered until you pick one, and the dialog says `Select a datasource to preview this query.`
+- When the rule currently matches no data source, the dialog says `This rule has no matching datasource. Configure a rule datasource first.` Configure the rule's data source under "Datasource and query" first.
+- A dashboard entry with no dashboard selected, or a query entry with no usable data source, renders no preview content.
+
+**Entries that use template variables: a preview from a real alert's event snapshot.** As soon as one dashboard variable value or the query expression contains `{{`, the dialog renders from an alert snapshot instead:
- Prerequisites: the **rule must be saved** (otherwise it says `Save the rule first, then preview once it has an alert.`) and the rule must **currently have an active alert** (otherwise `This rule has no active alerts. Preview will be available once an alert fires.`). The dialog picks a sample from the rule's active alerts, with paging above 20.
- The preview uses the selected alert's **event snapshot** and **does not include unsaved changes in the form**, so save the rule and wait for it to fire before previewing a new configuration.
-- Clicking an entry in the dialog opens the target in a new tab. If that alert has no snapshot matching this entry, it says `This alert has no matching snapshot for this entry. Select an alert generated after the configuration took effect.`; if the alert has no snapshot at all, it says `This alert has no investigation links. Select an alert generated after the configuration took effect.`
+
+In both modes you can click an entry in the dialog to open the target in a new tab. In snapshot mode, if that alert has no snapshot matching this entry, it says `This alert has no matching snapshot for this entry. Select an alert generated after the configuration took effect.`; if the alert has no snapshot at all, it says `This alert has no investigation links. Select an alert generated after the configuration took effect.`
## Validation and limits
diff --git a/en/monitors/dashboards/dashboards.mdx b/en/monitors/dashboards/dashboards.mdx
index 099629abb..af9e8f489 100644
--- a/en/monitors/dashboards/dashboards.mdx
+++ b/en/monitors/dashboards/dashboards.mdx
@@ -17,8 +17,9 @@ Whether you can view or edit a dashboard depends on its **folder** — see [Perm
The left side is the folder tree shared with alert rules; the right side lists the dashboards in the current folder. Folders are created, renamed, moved and deleted on the tree — see [Folder management](/en/monitors/folders/folders).
-- The box above the folder tree on the left searches the **current folder** only; the search term and page are kept in the page address, so links can be shared and returning from a dashboard restores the list.
-- **Global search** at the top right of the page looks across every folder you can read (the backend filters by permission), ignoring the folder you are currently in: it matches a dashboard's **title or description**, with multiple keywords separated by spaces. Each result shows the title, its folder path and the description, and clicking one opens that dashboard; results are paged 20 at a time and there is a **Retry** button if the request fails. This dialog's search state lives only in the dialog — closing it discards the search, and it is never written into the page address.
+- The box above the folder tree on the left searches the **current folder** only; the search term and page are kept in the page address, so links can be shared and returning from a dashboard restores the list. The page size you pick is remembered in the browser and reused the next time you open this list.
+- **Search all dashboards** at the top right of the page looks across every folder you can read (the backend filters by permission), ignoring the folder you are currently in: it matches a dashboard's **title or description**, with multiple keywords separated by spaces and a keyword at most 128 characters long. Each result shows the title and its folder path (a long path wraps so it stays fully visible), and clicking one opens that dashboard; results are paged 20 at a time and there is a **Retry** button if the request fails. This is not a dialog: the search box expands in place and its results appear in a dropdown panel below it. The search state lives only in that box; close it with the ✕ on the right, with `Esc`, or by clicking outside the panel, and the search is discarded — it is never written into the page address.
+- When you open the search box without typing a keyword, the panel lists the 5 dashboards you opened **recently** (title plus the full folder path); clicking one opens it and moves it to the front of the list. The list is stored only in this browser for the current account, is never uploaded to the server, and you can empty it with **Clear history**.
- Each row's **More** menu offers: move to another folder, clone to this folder, clone to another folder. A clone is a new dashboard whose title gets a "copy" suffix and **does not carry version history**; moving or cloning into another folder requires read access to that folder.
## Create and save a dashboard
@@ -270,3 +271,4 @@ If someone saves the dashboard while you are viewing it, the page loads the late
| Versions kept | 20 |
| Trash retention | 30 days |
| Dashboard definition size | 1 MiB |
+| Keyword length in Search all dashboards | 128 characters |
diff --git a/en/monitors/data-sources/data-sources.mdx b/en/monitors/data-sources/data-sources.mdx
index addbe843a..fc9714e93 100644
--- a/en/monitors/data-sources/data-sources.mdx
+++ b/en/monitors/data-sources/data-sources.mdx
@@ -41,7 +41,7 @@ The list shows only the data sources you are allowed to query, with these column
- **Associated Alert Engine**: the engine cluster that runs queries, with its online status
- **Enable datasource**: turns the data source on or off — see [Enable and alert evaluation](#enable-and-alert-evaluation)
-You can search by name, type, connection URL or remarks. The list refreshes engine status every 5 seconds.
+You can search by name, type, connection URL or remarks. The list refreshes engine status every 5 seconds. The page size you pick is remembered in the browser and reused the next time you open this list.
## Data source permissions (team authorization)
diff --git a/en/monitors/engine/engine-lost-alert.mdx b/en/monitors/engine/engine-lost-alert.mdx
index 3ed0ccda7..db6a3886e 100644
--- a/en/monitors/engine/engine-lost-alert.mdx
+++ b/en/monitors/engine/engine-lost-alert.mdx
@@ -14,7 +14,7 @@ For an engine cluster composed of multiple instances, as long as at least one in
## Alert rule list
-The list shows the configured rules and their main parameters (see [Create an alert rule](#create-an-alert-rule) for what each means). You can search by keyword, customize the displayed columns, and enable or disable a rule with its switch.
+The list shows the configured rules and their main parameters (see [Create an alert rule](#create-an-alert-rule) for what each means). You can search by keyword, customize the displayed columns, and enable or disable a rule with its switch. The page size you pick, along with which columns are shown and their order, is remembered in the browser and reused the next time you open this list.
## Create an alert rule
diff --git a/en/monitors/engine/engine.mdx b/en/monitors/engine/engine.mdx
index 6734e67ab..0249f6209 100644
--- a/en/monitors/engine/engine.mdx
+++ b/en/monitors/engine/engine.mdx
@@ -12,7 +12,7 @@ The alert engine page contains three tabs: **Alert Engine Status**, **Engine Ins
## Alert engine status
-Displays information about all registered alert engine instances. The list auto-refreshes every 5 seconds.
+Displays information about all registered alert engine instances. The list auto-refreshes every 5 seconds. The page size you pick is remembered in the browser and reused the next time you open this list.
| Column | Description |
|--------|-------------|
diff --git a/en/monitors/explore/explore.mdx b/en/monitors/explore/explore.mdx
index 1c63dcfc2..f6b174719 100644
--- a/en/monitors/explore/explore.mdx
+++ b/en/monitors/explore/explore.mdx
@@ -38,7 +38,7 @@ The result area auto-layouts based on data source and query type:
- **Prometheus**: Split pane — line chart (Graph) on top, raw samples (Raw) below, with a draggable splitter.
- **Other data sources**: Single result pane showing log view, table view, or samples view depending on the query type.
-The samples view shows 20 rows per page; the table view shows 100 rows per page by default, or 200 or 500.
+The samples view defaults to 20 rows per page; the table view defaults to 100 rows per page and can switch to 200 or 500. The row count you pick in either view is remembered in the browser and reused after a page refresh or a new query; only the sort order resets with new results.
### Graph features
diff --git a/en/monitors/folders/folders.mdx b/en/monitors/folders/folders.mdx
index c02439994..0dbec1fa5 100644
--- a/en/monitors/folders/folders.mdx
+++ b/en/monitors/folders/folders.mdx
@@ -29,6 +29,25 @@ When a folder is selected, the right side displays its detailed information:
| **Updated At** | Last modification time |
| **Created At** | Creation time |
+## Moving rules to another folder
+
+You can move alert rules to another folder. The rule itself does not change, only the folder it belongs to.
+
+- **One rule**: select **Move** in the row's `⋮` menu.
+- **Several rules**: select the rules, then click **Move** above the list.
+
+Both entry points open the **Move to another folder** dialog:
+
+| Action | Description |
+|--------|-------------|
+| **Search folders** | Type a keyword to filter the folder tree by name (case-insensitive); matches keep their full path. Typing clears the folder you selected |
+| **Select a folder** | Click the target folder in the tree. The dialog lists only the folders you can access |
+| **Confirm** | No folder is pre-selected when the dialog opens. The button stays disabled while no folder is selected, while the selected folder is the current one, and while the tree is loading or has failed to load |
+
+When the folder tree fails to load, the dialog shows `Failed to load folders` with a **Retry** button.
+
+A successful move shows `Moved successfully` and refreshes the list. A failure shows `Move failed` and leaves the rule in its original folder; that is what happens when you have no permission on the target folder, for example. When the target folder already holds a rule with the same name, that rule is not moved.
+
## Team access control
Folders support team-based access control by binding teams to folders to restrict operation permissions.
diff --git a/en/monitors/quickstart/quickstart.mdx b/en/monitors/quickstart/quickstart.mdx
index 548d2cebe..125484c57 100644
--- a/en/monitors/quickstart/quickstart.mdx
+++ b/en/monitors/quickstart/quickstart.mdx
@@ -212,9 +212,9 @@ Section 6 configures **investigation entries**: it wires each alert straight to
| **Add dashboard entry** | Pick a dashboard and target the whole dashboard, a tab, a section or a panel, setting the values of that dashboard's template variables |
| **Add query entry** | Store an initial query (data source + query type + query + query parameters) that runs on the alert event's own data source by default |
| **Purpose** | One sentence on what this entry helps confirm; optional |
-| **Time range** | "N min before the alert to M min after", anchored on the alert event time; defaults to 60 minutes before and 0 after |
+| **Time range** | "N min before the alert to M min after", anchored on the alert event time; defaults to 60 minutes before and 30 minutes after |
-You can add up to 20 entries and drag them into any order (order only affects display). The eye icon on an entry opens a **preview** rendered from one of the rule's real alerts. Entries take effect when you save the rule and are rendered into a snapshot delivered with the alert event, so editing the rule does not change alerts already produced.
+You can add up to 20 entries and drag them into any order (order only affects display). The eye icon on an entry opens a **preview**: entries that use no template variable preview the current form configuration at the current time, while entries that use template variables render from one of the rule's real alerts. Entries take effect when you save the rule and are rendered into a snapshot delivered with the alert event, so editing the rule does not change alerts already produced.
Saving investigation entries requires monit-edge `v0.75.3` or later: saving checks every active instance in the clusters of the data sources the rule matches, and rejects the save if any instance is older.
@@ -301,7 +301,9 @@ If some rules fail to update, you see the number of failures and the first reaso
### Batch move
-After selecting multiple rules, you can batch move them to another folder.
+After selecting multiple rules, click **Move** above the list to move them to another folder. To move a single rule, select **Move** in the row's `⋮` menu.
+
+Both entry points open the **Move to another folder** dialog: pick a target folder in the tree, or filter by name with **Search folders** first (typing clears the folder you selected). **Confirm** stays disabled while the selected folder is the one you are currently viewing. A successful move shows `Moved successfully` and refreshes the list. See [Folder management](/en/monitors/folders/folders).
## Import alert rules
diff --git a/en/on-call/channel/create-edit.mdx b/en/on-call/channel/create-edit.mdx
index 233236b75..a72569301 100644
--- a/en/on-call/channel/create-edit.mdx
+++ b/en/on-call/channel/create-edit.mdx
@@ -212,6 +212,7 @@ See [Configure Noise Reduction](/en/on-call/channel/noise-reduction) for details
| **Channel name** | Sort alphabetically by name |
- Select **Sort** in the upper-right corner, then drag channel cards to change the display order. The new order applies to all users
+- The pagination control at the lower right of the list switches the number of items per page (12 / 24 / 48 / 96, default 24); you can also enter a custom page size, up to 100 items
### Changing configuration
diff --git a/en/on-call/channel/noise-reduction.mdx b/en/on-call/channel/noise-reduction.mdx
index 913770ee2..511ebc250 100644
--- a/en/on-call/channel/noise-reduction.mdx
+++ b/en/on-call/channel/noise-reduction.mdx
@@ -78,6 +78,37 @@ When a monitoring system pushes alerts to Flashduty On-call, the system automati

+## Let AI configure noise reduction for you
+
+The header of the **Alert grouping** and **Flapping detection** pages carries a **Let AI tune noise reduction** button on the right (same row as the page title and description). It opens [AI SRE](/en/ai-sre) in the side panel, takes this channel along as a context reference, and prefills a request for the page you are on:
+
+| Entry | Prefilled request (with channel "prod" as an example) |
+| :--- | :--- |
+| **Alert grouping** | `/channel-noise Analyze the alert noise in Channel "prod", then recommend and configure alert grouping` |
+| **Flapping detection** | `/channel-noise Analyze the alerts that keep re-firing in Channel "prod", then recommend and configure flapping detection` |
+
+The reference tag is titled after the channel, so the agent knows which one to work on. `/channel-noise` is the matching built-in [Skill](/en/ai-sre/skills), reachable only from this entry, and it tunes one channel per session. You can send the prefilled request as it is, or rewrite it first — to narrow the look-back window, for example, or to name the grouping dimensions you must keep. After that you keep talking in plain language to refine what you asked for.
+
+
+ **Prerequisite**: AI SRE is enabled for the account and you have permission to use AI SRE conversations. The button is hidden when either is missing.
+
+
+The agent then works through these steps:
+
+
+
+ It pulls this channel's recent alerts, over an adjustable look-back window of up to 30 days. From them it counts the titles that fire most, bursts where one title fires many times in a short span (and the labels that vary inside a burst), `alert_key`s that keep re-firing, and each label's coverage and number of distinct values. Nothing is written in this step.
+
+
+ It recommends a grouping method and dimensions, or a flapping observation window, state change threshold and mute duration, and says what the numbers are based on. On the Alert grouping page it also replays candidate dimensions through the page's own grouping preview, so it can give you an expected incident count and reduction instead of general advice.
+
+
+ Nothing is written straight away. The agent can fill the recommended values into the form for you to review and save, or — when you choose to save directly — call the page's own save. In that case a confirmation card lists every setting it will change with its before and after value (for example, "Dimensions: `labels.check` → `labels.check` + `labels.service`"), and only your confirmation writes it. The change takes effect immediately and the page refreshes itself.
+
+
+
+`/channel-noise` changes **Alert grouping** and **Flapping detection** only. For **Event aggregation**, silence rules, inhibit rules and drop rules it recommends what to change and names the page to change it on, but never writes. For how a reference tag travels with a message and how sessions are managed, see [Console chat](/en/ai-sre/sessions#attachments-and-context-references).
+
## Event aggregation
Go to Channel Details → **Noise Reduction** → **Event Aggregation** to configure.
diff --git a/en/on-call/configuration/service-calendar.mdx b/en/on-call/configuration/service-calendar.mdx
index a445f50f8..0d66cb243 100644
--- a/en/on-call/configuration/service-calendar.mdx
+++ b/en/on-call/configuration/service-calendar.mdx
@@ -22,7 +22,7 @@ description: Service calendars define workdays and rest days, working with escal
## Creating a calendar
-Go to **Configuration → Service Calendar** and click **Add Calendar**.
+Go to **Configuration → Service Calendar** and click **Create**, then fill in the form in the **Create Service calendar** panel on the right.
| Configuration | Description |
| --- | --- |
@@ -45,8 +45,8 @@ New calendars default to all workdays. After creation, open the calendar detail
| Action | Description |
| --- | --- |
| **Modify Basic Info** | Calendar name, description, management team |
-| **Link Holidays** | On the calendar detail page, link national holiday calendars. The system automatically marks statutory holidays as rest days and make-up workdays as workdays; you can adjust or unlink them at any time |
-| **Bulk Mark Rest Days** | Quickly mark by day of week, for example, every Saturday and Sunday as rest days |
+| **Link Holidays** | On the calendar detail page, link national holiday calendars. The system automatically marks statutory holidays as rest days and make-up workdays as workdays; you can adjust or unlink them at any time. The dropdown lists only the holiday calendars of the current interface language (an already-linked calendar of another language stays in the list so you can unlink it), and several can be linked at once; selecting or clearing an option saves and takes effect immediately, with no separate save step |
+| **Bulk Mark Rest Days** | Quickly mark by day of week, for example, every Saturday and Sunday as rest days. A week must keep at least one workday: once only one workday is left, its toggle can no longer be switched to a rest day. With no rest day set, all seven days count as workdays |
| **Adjust Dates** | Click a date, or click two dates to select the days between them, then click **Set as workday**, **Set as day off**, or **Reset to default** in the action bar below. The note is optional |

@@ -73,9 +73,11 @@ Deleting a calendar is irreversible. Confirm no escalation rules or silence rule
2. **Linked holiday calendars**: a make-up workday wins over holiday rest days
3. **Weekly rest days**: rest days marked by day of week
+ Within one calendar, a day keeps only the last manual setting. Setting dates again (as a workday or a day off) that are already covered by an existing setting overwrites it: an existing setting entirely inside the selected range is deleted, one that only partly overlaps is shortened, and one spanning the whole range is split in two.
+
A day with none of these settings is a workday. Clicking **Reset to default** on a day clears its manual setting, and the day goes back to the holiday calendars and weekly rest days.
- On the calendar, yellow marks a day off and green marks a workday set manually or by a holiday make-up day. Uncolored days follow the weekly settings and are workdays.
+ On the calendar, yellow marks a day off and green marks a workday set manually or by a holiday make-up day. Uncolored days follow the weekly settings and are workdays. Days set manually on this calendar additionally carry a ring around them, telling them apart from days decided by a holiday calendar or by the weekly rule. Hover over a day to see which layer decided it and which settings it overrides (listed with a strikethrough).
diff --git a/en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx b/en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
index e7d6bc592..e164208a2 100644
--- a/en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
+++ b/en/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
@@ -124,19 +124,21 @@ Key fields from the push message are preserved as labels on the alert event and
| Label | Source field | Description |
| ----- | ------------ | ----------- |
-| alert_type | title | Alert family (DataWorks_Remind) |
+| alert_type | message.title | Alert family: DataWorks_Remind, DataWorks_Baseline_Alert, or DataWorks_Event_Remind |
| remind_name | remind_name | Rule name |
-| remind_unit | remind_unit | Monitoring granularity (Task, ScheduleResourceGroup) |
+| remind_unit | remind_unit | Monitoring granularity (Task, Baseline, Project, BizProcess, ScheduleResourceGroup, DiResourceGroup) |
| remind_type | remind_type | Raw trigger condition |
-| occur_time | occur_time | Raw occurrence time string |
+| occur_time | occur_time | Raw occurrence time string (2021-07-13 16:16:20); set for all three alert families |
| remind_founder | remind_founder | Rule creator |
| more_information | more_information | Operation Center instance URL |
-| task_size / number_of_alerts | same-name fields | Task count / nth alert notification |
-| node_id_list / node_name_list / node_owner_list | same-name fields | Node IDs / names / owners (comma-separated, up to 5) |
-| resource_group_name / threshold / duration | same-name fields | Resource group name / threshold / duration (minutes), resource group monitoring only |
+| task_size / number_of_alerts | same-name fields | Task count / nth alert notification; generated only when greater than 0 |
+| node_id_list / node_name_list / node_owner_list | same-name fields | Node IDs / names / owners (comma-separated, up to 5); non-resource-group monitoring only |
+| resource_group_name / threshold / duration | same-name fields | Resource group name / threshold / duration (minutes); resource group monitoring only |
| baseline_name / baseline_owners | same-name fields | Baseline name / baseline owners |
-| cycle_number / key_instance / sla_time / buffer / status | same-name fields | Cycle number / key instance / SLA time / buffer (minutes) / baseline status |
-| task_name / task_owner_name / event_type / event_name | same-name fields | Task name / owner / event type / event name |
+| cycle_number / key_instance / sla_time / buffer / status | same-name fields | Cycle number (1 for a daily baseline) / key instance / SLA time / buffer (minutes) / baseline status (dangerous or overSla) |
+| task_name / task_owner_name / event_type / event_name | same-name fields | Task name / owner / event type (ERROR or SLOW) / event name |
+
+Empty-valued fields do not produce labels. The alert title comes from the family's name field: `remind_name` for custom alerts, `baseline_name` for baseline alerts, and `task_name` for event alerts.
diff --git a/en/openapi/api-catalog.mdx b/en/openapi/api-catalog.mdx
index 7a014e59e..0cd907c98 100644
--- a/en/openapi/api-catalog.mdx
+++ b/en/openapi/api-catalog.mdx
@@ -510,7 +510,7 @@ The `POST /safari/session/get` response includes a new `pending_messages` field,
| `query` | string | The message text, consistent with the send-ack frame |
| `parts` | array | The message's parts (`text` / `file` / `ref` / `skill`), passed through verbatim (optional) |
-Only plain human messages are projected: rows produced by internal producers (automation, child-session notifications, parent initial messages — they carry `source`) and question answers (`function_response`) are excluded. If the queue can't be read, the field falls back to an empty array instead of failing the request. The projection matches the `user_message_enqueued` frame payload and is what clients use to render "sent but not yet handled" pending bubbles.
+Only plain human messages are projected: rows produced by internal producers (automation, child-session notifications, parent initial messages — they carry `source`), question answers (`function_response`) and the batched page-action receipts (`function_responses`) are excluded. If the queue can't be read, the field falls back to an empty array instead of failing the request. The projection matches the `user_message_enqueued` frame payload and is what clients use to render "sent but not yet handled" pending bubbles.
### Automations
diff --git a/en/rum/explorer/data-query.mdx b/en/rum/explorer/data-query.mdx
index 7cfd6702e..94ae488ea 100644
--- a/en/rum/explorer/data-query.mdx
+++ b/en/rum/explorer/data-query.mdx
@@ -93,6 +93,7 @@ Use `attribute:term` syntax to search specific attributes:
|----------|------|
| `browser_name:Chrome` | Search for browsers with value `Chrome` |
| `view_name:*/detail` | Search for view names ending with `/detail` |
+| `browser_name:*` | Search for events that contain the field: `*` as the whole value means the field exists (`IS NOT NULL`), not a wildcard |
| `-resource_status_code:0` | Search for resources with status code not `0` |
| `os_name:"Mac OS X"` | Search for OS names with value `"Mac OS X"` |
diff --git a/en/rum/quickstart/app-management.mdx b/en/rum/quickstart/app-management.mdx
index 35ff973b0..dcc0a3c47 100644
--- a/en/rum/quickstart/app-management.mdx
+++ b/en/rum/quickstart/app-management.mdx
@@ -26,6 +26,8 @@ To meet the data security requirements of different business scenarios, RUM appl
In private applications, if other members need to view content, they can be temporarily authorized to access it by sharing the incident link.
+Beyond visibility, this read permission also applies to data queries: the events returned by Explorer queries and by the data query API (`POST /rum/data/query`) are filtered by application read permission. If a query explicitly names an application you cannot read, the whole batch fails rather than dropping just that application's data. A query that names no application automatically excludes the applications you cannot read (private applications where you are neither the creator nor on their management team) and private applications that have been deleted. The account owner and account administrators can read every application in the account, so nothing is excluded for them. A single request can name at most 50 applications; above that limit the whole batch returns a parameter error.
+
## Create application
diff --git a/zh/ai-sre/sessions.mdx b/zh/ai-sre/sessions.mdx
index 609ecc160..f45a7251a 100644
--- a/zh/ai-sre/sessions.mdx
+++ b/zh/ai-sre/sessions.mdx
@@ -92,6 +92,8 @@ sidebarTitle: "控制台对话"
从故障、告警、监控规则、监控对象、数据源或 RUM 异常详情页(**AI 修复** 按钮)进入 AI SRE 时,相关对象会作为**引用标签**自动放进输入框,随消息一起发给 Agent。点击标签可以打开该对象,发送前也可以移除。
+ 从**协作空间详情 → 降噪处理 → 告警聚合 / 抖动检测**页头的 **让 AI 帮我配置降噪** 进入时,该协作空间同样会作为引用标签放进输入框(引用类型 `channel_noise`,并记下这一轮聚焦的是告警聚合还是抖动检测),同时预填一条以 `/channel-noise` 开头的提问。这是 `/channel-noise` 唯一能启动的入口:在 IM、自动化或 API 会话里输入该命令会被拒绝。详见 [Skill](/zh/ai-sre/skills)。
+
这些入口通常还会预填一句提问(例如要求 Agent 区分已确认事实与推断),您可以修改后再发送。一次带入多个引用时不会预填提问。
在任意会话中输入 `@` 可以搜索故障并插入引用。输入邮箱地址时不会触发搜索。
@@ -145,6 +147,30 @@ Agent 需要您澄清信息时,会在对话中插入提问卡片,可能是
如果您不回答卡片而是直接发送新消息,提问会被视为跳过,您的消息立即执行。已经跳过或在其他设备回答过的提问,再提交答案会作为一条普通消息发送。
+### 操作控制台页面
+
+有些控制台页面会**声明自己能被 AI 操作**:它把当前可用的动作清单、以及您所在的页面,随每一轮消息一起发给 Agent。因此在这类页面上,Agent 不只是给出文字建议,还可以直接读取和填写页面上的表单。
+
+目前注册了页面动作的页面是协作空间降噪处理下的 **告警聚合** 与 **抖动检测** 两页,见[告警降噪](/zh/on-call/channel/noise-reduction)。页面没有注册动作时,Agent 对它零能力;其余页面会随版本逐步支持。页面动作只在控制台会话里存在——它由浏览器在您的页面上执行,所以在 IM、API 和自动化会话中不会出现。
+
+调用一个页面动作时,这一轮会停下来等页面执行完(与上面的 **Agent 提问** 一样是等待回执的调用),结果回到 Agent 后才继续。其中:
+
+- **读取**表单(字段、当前值、可选项、是否可写)不需要任何授权。
+- **填写**字段只是把值写进表单,不会替您提交——您复核后自己点 **保存**。写完后 Agent 会再读一次表单,确认最终落下来的值。
+- **保存**这类会立即生效的动作,每次都单独向您确认。
+
+执行期间,页面四周会出现一圈品牌色高亮,顶部出现 **AI 正在操作页面** 状态条;完成后状态条变为 **已完成**,您也可以点 **停止** 中断。
+
+动您页面上的东西之前,Agent 会先用提问卡片问您这次改动**怎么落地**——填进表单由您复核后自己保存,还是直接保存——然后只做您选的那一种。这个「已同意」由前端从对话记录里读出,不由 Agent 自己声称,页面或告警里的文字诱导不了它。
+
+填写字段属于这一轮已同意的范围,不再逐字段询问,但**每一个保存动作都会在对话里单独弹出一张确认卡片**(渲染在输入框上方):标题形如“保存「X」的告警聚合配置?”,并把将要改变的值列成「原值 → 新值」,按钮是 **取消** 和动作自带的动词(如 **保存**)。点 **取消** 即不执行。
+
+您发出新消息、或离开这个会话后,本轮尚未答复的确认卡片会自行失效,页面上未完成的动作同时被放弃。以**只读**方式打开他人分享的会话(见[分享会话](#分享会话))时,页面动作不会执行——那是别人的对话,不是您的授权。
+
+
+当您所在的页面提供了可填写的表单时,Agent 不会绕开页面改用 `fduty` 命令写同一项配置——这项改动应该走表单,让您看到将要保存的内容并自己保存。页面动作失败时它会如实说明并停下,不会换一条路把改动写下去。
+
+
### 需要授权时
工具或 MCP 调用缺少凭证或 OAuth 授权时,对话中会出现 **授权〈资源名〉以继续** 卡片:
@@ -311,7 +337,7 @@ IM 和 API 会话不显示草稿卡,Agent 会在回复开头给出“审阅并
| `consumed` | Agent 已读取,撤回不生效;如需中断请使用停止 |
| `forbidden` | 调用者不是消息作者 |
-只能撤回普通的人工消息,提问作答和系统内部产生的消息不能撤回。调用方需要具备该会话的对话权限。
+只能撤回普通的人工消息:提问作答(`function_response`)与页面动作的批量回执(`function_responses`)都不算普通人工消息,系统内部产生的消息同样不能撤回。调用方需要具备该会话的对话权限。
### 流式事件中的错误标记
diff --git a/zh/ai-sre/skills.mdx b/zh/ai-sre/skills.mdx
index ddefe7656..c52db9b74 100644
--- a/zh/ai-sre/skills.mdx
+++ b/zh/ai-sre/skills.mdx
@@ -88,9 +88,18 @@ AI SRE 运行时内置了以下 Skill,无需安装即可使用:
| `github` | 在 GitHub 仓库里工作:探索代码、调查 PR / 提交、按需开 PR 或 Issue | 安装 GitHub App(云端)或运行环境主机上的 `gh`(BYOC),见 [Apps](/zh/ai-sre/apps) |
| `gitlab` | 与 `github` 对称:探索代码、追溯 MR / Issue、按需开 MR 或 Issue | 安装 GitLab App(云端)或运行环境主机上的 `glab`(BYOC) |
| `flashduty-docs` | 检索 Flashduty 官方文档(中英文页面、术语表与 Open API 规范),回答产品本身怎么用(功能、设置、上限、套餐、兼容性、SDK 行为、API 字段与错误码),附 docs.flashduty.com 链接;只依据文档作答,文档没写的会直说。不代替动手排查(RUM 接入归 `rum`) | 无需配置 |
+| `channel-noise` | 分析某个协作空间的告警噪音,给出**告警聚合**与**抖动检测**的推荐设置,**经您确认后写入该空间**;只能从协作空间的降噪处理页面进入,见下文 | 已开通 AI SRE;入口在 **协作空间详情 → 降噪处理 → 告警聚合 / 抖动检测** 页面 |
此外还有 `init`、`insight`、`artifact-design`、`alert-governance`、`monit-query` 等,并随版本增补。某条会话里实际可用的 Skill,直接问 Agent 即可。
+### `channel-noise`:只从协作空间的降噪页进入,且会写配置
+
+`channel-noise` 与其他内置命令有两点不同。
+
+**只能从协作空间的降噪处理页面进入。** 在 **协作空间详情 → 降噪处理 → 告警聚合** 或 **抖动检测** 页面,点击 **让 AI 帮我配置降噪** 会打开 AI SRE 面板,把该协作空间作为引用带入这一轮对话、并预填 `/channel-noise` 提问,您确认发送后才启动。这一轮对话之外的所有入口——IM、自动化规则、Open API——输入 `/channel-noise` 都会被拒绝,提示 `"/channel-noise can only be started from its entry in the console."`:该 Skill 需要 `channel_noise` 类型的协作空间引用(用于确定处理哪个空间,以及页面当前聚焦告警聚合还是抖动检测)才能开始。`/` 补全里会列出它,但只有从上述入口开启的这一轮对话能启动它。它也不在 Agent 的可用 Skill 清单里,所以在其他入口用自然语言让 Agent“看看这个空间的告警噪音”不会选中它。
+
+**它会写配置。** 它读取该协作空间自己的告警历史(默认近 30 天,可按需缩短时间窗),先定位噪音来自哪里,再估算 2–4 组**告警聚合**与**抖动检测**候选设置并给出推荐;只有您明确确认之后,它才通过 `fduty channel update` 写入该空间并回读复核。改动范围仅限 `group`(告警聚合)与 `flapping`(抖动检测);事件聚合、静默、抑制、丢弃等其他降噪设置只给出修改建议与对应页面,由您自行调整。在该页面上使用时,它也可以把推荐值填入表单,等您点击 **保存** 后生效。
+
## 从市场安装
Skill 市场位于 **自定义 → 插件 → 概览** 的插件目录中,归在 **Skill** 类别下,可按名称或描述搜索。
diff --git a/zh/changelog/changelog.mdx b/zh/changelog/changelog.mdx
index 3721f4c7b..a101072cf 100644
--- a/zh/changelog/changelog.mdx
+++ b/zh/changelog/changelog.mdx
@@ -4,11 +4,32 @@ description: "本页面记录 Flashduty 产品的重要更新和功能发布"
keywords: ["更新日志", "产品发布", "功能更新", "Flashduty", "版本记录"]
---
-
+
+
+### AI 辅助降噪:让 AI 分析协作空间的噪音并直接配置
+
+协作空间详情 → **降噪处理** 下的 **告警聚合** 与 **抖动检测** 两页,页头新增 **让 AI 帮我配置降噪** 按钮(账户已开启 AI SRE、且您有 AI SRE 会话访问权限时显示)。点击后右侧打开 AI SRE 面板,输入框自动带上该协作空间的上下文引用胶囊与一句预填提问——聚合页问「帮我分析……的告警噪音,推荐并配置告警聚合」,抖动检测页问「帮我分析……里反复触发的告警,推荐并配置抖动检测」;新会话默认以该空间所属的团队为范围。提问以 `/channel-noise` 开头,发送后由内置 **channel-noise** Skill 接手,这条指令也是它唯一的入口。
+
+Skill 先读这个协作空间自己的告警历史,再给建议:出现最多的告警标题及其占比、10 分钟内同一标题连发 5 条及以上的爆发(并区分爆发内取值一致的标签与取值不同的标签——取值不同的标签只会把爆发拆开,不适合做聚合维度)、反复回来的 `alert_key`(同一告警键出现 3 条及以上,是抖动的信号),以及各标签的覆盖率与取值个数(覆盖率过低、或取值个数接近告警条数的维度合并不了什么)。页面内的分析默认回看最近 **7 天**(最多 5 页 × 100 条),命令行采集默认最近 **30 天**、上限 1000 条,样本不全时会说明画像只覆盖了最近的若干条。聚合候选用页面 **预览** 背后的同一条真实引擎试算,给出会合并成多少条故障、相对告警数下降多少,以及最大的几条故障里是否混了不相关的标题;抖动候选在本地按历史重放估算。所有数字只来自这份画像与估算结果,估算一律标明是估算。
+
+真正会写进配置的只有 **告警聚合**(`group`)与 **抖动检测**(`flapping`)两项,且每次都先征求同意:Skill 以纯文本列出「字段:原值 → 新值」与预计效果,等您明确同意才动手。在页面上可直接选 **填入表单**(只填不保存,由您点页面的 **保存** 生效)、**直接保存** 或 **不修改**;无论之前同意了哪种,保存的瞬间都会弹出确认卡片,逐行列出售改动字段的变更前后值并标注「保存后立即生效」,确认后才写入。抖动检测可调的 **观测窗口**(1–1440 分钟)、**状态变化次数**(2–100 次)与 **静默时长**(30–1440 分钟,0 为只提醒、不静默)都会在建议里给出具体取值。事件聚合、静默、抑制与丢弃规则不在代写范围内,只给改动建议与对应页面;若该协作空间由 Terraform 管理,则改为把改动作为代码变更提出,不经 API 写入。写完会重新读取并回显服务端当前的配置,与原值不符会直接说明;经页面保存的配置,页面已自行刷新,无需手动刷新。详见[告警降噪](/zh/on-call/channel/noise-reduction)。
+
+### 告警规则:调查入口预览更省事,规则移动有了对话框
+
+**预览跳转** 现在按入口是否使用模板变量分成两档。变量取值与查询语句里都不含 `{{` 的入口按当前配置直接预览:用表单里当前的值(包括还没保存的修改)与当前时间去算跳转,不需要先保存规则、也不要求该规则已有活跃告警。查询入口没指定数据源、而规则匹配到多个数据源时,弹层里会多一个 **预览数据源** 下拉(占位「选择用于预览的数据源」),不选则提示「请选择预览数据源。」;规则一个数据源都没匹配到时提示「该规则暂无匹配的数据源,请先配置规则数据源。」。用了 `{{ }}` 的入口仍按告警事件里的配置快照预览:规则还没保存时先提示「请先保存规则,产生告警后再预览。」,有活跃告警时从 **告警样本** 里选一条(每页 20 条,加载失败可 **重试**,没有活跃告警时提示「该规则暂无活跃告警,产生告警后可预览。」),选中的告警若没有这条入口的快照,会提示改选配置生效后产生的告警。
+
+新建调查入口的 **时间范围** 默认值改为告警前 **60** 分钟 / 告警后 **30** 分钟。**添加仪表盘入口** 的仪表盘选择器打开时先列出规则所在分组的仪表盘(每页 20 个,还有更多时给 **加载更多仪表盘**),输入关键词后改为跨目录按标题或描述远程搜索(占位「搜索仪表盘标题或描述」),每条结果都带所属分组路径。
+
+规则列表的移动操作换成 **移动到其他分组** 对话框:顶部一个 **搜索分组** 输入框在已加载的分组树上按名称过滤(没命中显示「没有匹配的分组」,加载失败显示「加载分组失败」并可 **重试**),没选分组、选中当前所在分组、分组树加载中或加载失败时 **确定** 都不可点;移动结果提示 **移动成功** 或 **移动失败**。目标分组里已有同名的告警规则时,这条规则不会被移动。详见[告警规则 · 调查入口](/zh/monitors/alert-rules/investigation-entries)与[文件夹管理](/zh/monitors/folders/folders)。
+
+
+
+
+
### 调查入口:从告警一键跳到仪表盘或查询工作台
-告警规则表单新增第六个区块 **调查入口**:为规则预置最多 **20** 个跳转目标,每个目标是一条 **添加仪表盘入口**(选定仪表盘、**定位到** 整个仪表盘 / 标签页 / 分组 / 图表,并为仪表盘变量填 **变量取值**)或一条 **添加查询入口**(数据源 + 查询类型 + 查询语句 + 查询参数;数据源留空即用告警事件的数据源)。每条入口可写 **调查用途**(一句话说明它能确认什么)与 **时间范围**(告警前 / 告警后各多少分钟,都不小于 0,且两者之和必须大于 0),拖动可调整展示顺序。变量取值按 Go 模板渲染,上下文只有 `$labels`(告警的原始数据标签,不含规则附加标签)与 `$datasource`(事件数据源的 id / name / type / address);查询语句原样渲染,不会自动加引号或转义,查询参数不做模板渲染。填好后可用 **预览跳转** 挑一条该规则的活跃告警试跳一次。
+告警规则表单新增第六个区块 **调查入口**:为规则预置最多 **20** 个跳转目标,每个目标是一条 **添加仪表盘入口**(选定仪表盘、**定位到** 整个仪表盘 / 标签页 / 分组 / 图表,并为仪表盘变量填 **变量取值**)或一条 **添加查询入口**(数据源 + 查询类型 + 查询语句 + 查询参数;数据源留空即用告警事件的数据源)。每条入口可写 **调查用途**(一句话说明它能确认什么)与 **时间范围**(告警前 / 告警后各多少分钟,都不小于 0,且两者之和必须大于 0),拖动可调整展示顺序。变量取值按 Go 模板渲染,上下文只有 `$labels`(告警的原始数据标签,不含规则附加标签)与 `$datasource`(事件数据源的 id / name / type / address);查询语句原样渲染,不会自动加引号或转义,查询参数不做模板渲染。填好后可用 **预览跳转** 试跳一次,预览方式按入口是否使用模板变量分成两档:变量取值与查询语句里都不含 `{{` 的入口,直接按表单当前(可能尚未保存)的配置与当前时间预览,无需先保存规则、也不要求该规则有活跃告警;只有用了 `{{ }}` 的入口才需要挑一条该规则的活跃告警,按该告警事件里的配置快照预览。
配置生效后,Monit 告警规则产生的告警与故障,其详情页右侧会在 **属性** 之后出现 **排查入口** 区块:按事件快照列出入口(默认显示 3 条,「还有 N 个」可展开),每条给出用途、数据源、变量与查询时间范围,下方附 **关联告警规则** 以及规则 **主查询 / 关联查询** 在触发时刻的值、结果与完整表达式;关联告警列表每行的 **排查** 浮层、监控的活跃告警详情抽屉里也能看到同一份入口。入口取自事件快照而非规则当前配置——规则改了不会改变已产生告警的入口,配置生效前产生的告警则完全没有入口。私有化部署需要留意版本:保存带调查入口的规则,要求该规则匹配到的数据源所在集群内 **所有** 已注册的 monit-edge 都是 `v0.75.3` 或以上,否则保存会被拒绝;快照渲染失败时页面会就地说明原因(规则已删除 / Edge 需升级 / 配置有误 / 内容超过 8KB)。详见[告警规则 · 调查入口](/zh/monitors/alert-rules/investigation-entries)与[检索与查看故障](/zh/on-call/incident/search-view-incident)。
@@ -28,9 +49,9 @@ keywords: ["更新日志", "产品发布", "功能更新", "Flashduty", "版本
值班表的 **定时通知** 不再只是「每天固定时间」:周期可选 **每天 / 每周 / 每月**,每周多选星期几、每月多选每月第几日(1–31),仍在所选日期的 HH:MM 按值班表时区发送。所选日期在当月不存在时(例如选 31 日遇上只有 30 天的月份),该月不发送通知;周 / 月周期至少要选一个日期才能保存。详见[值班管理](/zh/on-call/configuration/schedule)。
-### 仪表盘:全局搜索、面板查询方式与模板校验
+### 仪表盘:搜索全部仪表盘、面板查询方式与模板校验
-仪表盘列表页右上角新增 **全局搜索**:跨当前账号所有可读目录搜仪表盘(权限由后端过滤),按标题或描述匹配、多个关键词用空格分隔,结果带目录路径以便区分同名仪表盘,每页 20 条、失败可重试;它的搜索状态只活在弹窗里,与列表页「搜索当前目录」互不影响,也不写进页面地址。
+仪表盘列表页右上角新增 **搜索全部仪表盘**:跨当前账号所有可读目录搜仪表盘(权限由后端过滤),按标题或描述匹配、多个关键词用空格分隔,结果带目录路径以便区分同名仪表盘,每页 20 条、失败可重试;点开后就在列表头部原地展开一个搜索框,结果显示在搜索框正下方的下拉面板里,用 ✕、`Esc` 或点击面板外即可收起,还没输入关键词时先列出最近打开的 **5** 个仪表盘(记在当前账号的浏览器里,可 **清除记录**)。搜索状态只活在搜索框里,与列表页「搜索当前目录」互不影响,也不写进页面地址。
面板编辑器的查询 **选项** 里,Loki 的 **表格** 与 **单值** 面板现在可以自己选 **查询方式**:**区间** 按步长逐点计算画趋势、**即时** 整个时间范围算一个值(`[$__auto]` 取整段范围),表格默认即时、单值默认区间;Loki 时序仍固定区间,Loki 即时不接受 **最小步长**。查询类模板变量按数据源给出对应表单:MySQL 写 SQL、Loki 填 stream selector 与 label 名、其它数据源用 Prometheus 标签。查询表达式还会在编辑器里提前指出三类保存时会被拒绝的写法——多选或「可选全部」的变量写在精确匹配里、引用了未定义的变量、内置变量在当前数据源与查询方式下不可用;精确匹配那条可以一键 **改为正则匹配**。**预览候选** 也改为带上当前已选的变量值与面板时间范围去取数,预览结果与看板实际渲染一致。详见[仪表盘](/zh/monitors/dashboards/dashboards)。
diff --git a/zh/developer/cli.mdx b/zh/developer/cli.mdx
index 1999dcb5e..6a15c6c67 100644
--- a/zh/developer/cli.mdx
+++ b/zh/developer/cli.mdx
@@ -185,6 +185,8 @@ 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`(乐观锁,必须与当前存储版本一致)。
+工作项状态只接受 `open` / `in_progress` / `done` / `cancelled` 四个取值:`work-item-create --status` 省略或留空时默认 `open`,`work-item-update --status` 只能改成这四个值之一,`work-item-complete --target-status` 只接受 `done`(其它取值会被拒绝),`work-item-convert --target-status` 可传这四个值之一。
+
工作项的负责人可以是成员,也可以是**本账户的 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`),两者互斥,同时传会报错。
@@ -492,7 +494,25 @@ flashduty rum resource-info [--no-cache] # 查看 RUM 套餐版本、配额与
flashduty oncall license-list # 列出当前账户中持有有效 On-call 许可证的成员
```
-该命令只读,返回成员 ID、名称及许可证类型:`fixed` 表示固定分配,`temporary` 表示当前临时许可证窗口内生效。
+该命令只读,返回成员 ID、名称及许可证类型:`fixed` 表示固定分配,`temporary` 表示当前临时许可证窗口内生效。响应还带 `release_limited`:本账户在本计费周期内的 License 释放次数已用尽时为 `true`,此时释放成员席位会以错误码 `NoLicense` 失败;该额度即[每个计费周期的释放次数上限](/zh/platform/pricing)。
+
+### calendar — 服务日历
+
+服务日历是分派策略与静默规则判断工作日/休息日的依据,控制台侧的配置与层级优先级见[服务日历](/zh/on-call/configuration/service-calendar)。该命令组由 OpenAPI 生成(见下文「全量命令覆盖」):``(形如 `cal.`)为位置参数,取自 `calendar list` 响应 `items[]` 里的 `cal_id`;`list` 默认只列账户自有日历,列公共节假日日历要加 `--kind region.official.holiday`(默认按调用者所在地区过滤,加 `--no-locale` 取消过滤)。
+
+```bash
+flashduty calendar list [--kind personal|region.official.holiday] [--no-locale] # 列出日历
+flashduty calendar info|update|delete # 查看 / 修改 / 删除日历
+flashduty calendar event-list [--year ] [--month ] [--day ] # 列出事件,响应另带 days
+flashduty calendar event-upsert --start-at --end-at --is-off [--event-id ] [--summary ]
+flashduty calendar event-delete [--event-id | --start-at --end-at ]
+```
+
+以下三点只能从 `--help` 和响应本身看出来:
+
+- **`event-delete` 兼具删除单条事件与清空日期区间两种用法**。传 `--event-id` 删除一条事件;或传 `--start-at` 与 `--end-at`(均为 `YYYY-MM-DD`,`end_at` 为开区间、必须晚于 `start_at`)清空该日历自身在 `[start_at, end_at)` 内的全部事件。被清空的日期回落到关联的节假日日历与每周工作日,效果相当于在控制台里对这些日期点击**恢复默认**。
+- **`event-upsert` 会裁剪同区间内该日历自身的其他事件**:完全落在区间内的被删除、部分重叠的被缩短、跨越区间的被拆成两条,因此这些天以最后一次写入为准(`--summary` 可选)。
+- **`event-list` 的响应除行数组 `items` 外还有 `days`**:按 `YYYY-MM-DD` 给出请求范围内每一天的解析结果,含 `is_off`、决定该天的 `event_id` 与层级 `layer`——`custom`(日历自有事件)优先于 `holiday`(关联的节假日日历),再优先于 `weekly`(每周工作日);同一层级内工作日事件优先于休息日;`layer` 缺失表示没有任何事件覆盖该天,按工作日计。判断某天是否休息请读 `days`,不要从 `items` 反推:同一天可能同时存在多层事件。
### template — 通知模板
@@ -869,6 +889,8 @@ inc_abc123 DB connection timeout Critical Triggered Production 2026
inc_def456 High memory usage Warning Processing Staging 2026-04-10 09:15
Showing 2 results (page 1, total 2).
```
+
+生成命令的列表响应若在行数组(`items` / `docs` / `list`)之外还带其它字段(如 `calendar event-list` 的 `days`、`oncall license-list` 的 `release_limited`),表格会在行表格之后额外打印一行 `Also in the response: <字段> (use --json to see it).`,提示这些字段不在表格里,要看它们请用 `--json` 或 `--output-format toon`。
@@ -909,6 +931,8 @@ TOON 不能直接用 `jq` 解析;需要管道给 `jq` 时请改用 `--json`。
- **整行被丢弃**:写入 `truncated: true` 与 `emitted_rows: N`(N 为实际输出的行数)。此时信封中的 `total`、`has_next_page`、`search_after_ctx` 仍是服务端原始分页的原样回显,**不能**用来判断是否已取全——被截成「100 行中前 7 行」的一页照样带着原来的分页字段。要取全请按实际收到的行数收窄 `--limit` 重新请求,再沿返回的游标继续翻页。
- **只有长值被截短**(没有丢行):只写 `truncated: true`,stderr 会点名被截字段。重新请求无法找回这些值,请收窄筛选条件、减少每页行数,或改用支持字段投影的精选命令。
+**行数组还带非标量同级字段的响应不做缩减**。行数组为 `items` / `docs` / `list`、但同级还有对象或数组字段的响应(如 `calendar event-list` 的 `days` 地图),无法在不丢字段的前提下压进 16 KiB,因此整包原样输出、处理方式同本节末段的**明细形态的单个对象**:既不写 `truncated` / `emitted_rows`,也不截短任何值。
+
**顶层数组形态**的响应(如精选命令 `incident list`、`insight incidents`)没有信封可承载标记,缩减仍只写 stderr。
**明细形态的单个对象**(如 `safari session-get` 的详情)不做截断、原样输出——截短后的值无法与真实短值区分,因此这类响应不受上限约束。生成命令大多没有可收窄输出的标志(个别命令的 `--fields` 是请求体的字段选择器,不作用于输出);需要完整 JSON 时请通过 `--limit` 调小每页数量、配合 `--page` 分页逐页拉取(如 `flashduty safari session-list --limit 20 --page 2`),或按需收窄筛选条件。
diff --git a/zh/developer/go-sdk.mdx b/zh/developer/go-sdk.mdx
index 660a0539b..756d96712 100644
--- a/zh/developer/go-sdk.mdx
+++ b/zh/developer/go-sdk.mdx
@@ -245,6 +245,20 @@ out, _, err := client.DataSources.ToolsInvoke(ctx, req)
`enabled` 与 `alerting_enabled` 相互独立:`enabled`(业务执行开关)创建时默认 true,`alerting_enabled`(是否允许参与告警评估;告警还要求 `enabled` 为 true 且类型支持告警)创建时对告警类型默认 true、对诊断专用类型默认 false;二者更新时省略均保留当前值,显式传 `null` 非法;当有启用的告警规则引用该数据源时,将其 `enabled` 置为 false 会以 conflict 拒绝。另外 `/monit/datasource/list` 响应中 `payload` 恒为 `null`(列表查询不读 payload 列),create/update/info 响应中才会填充。
+### 服务日历事件
+
+`client.Calendars` 对应 `/calendar/*`。
+
+`CalEventIDRequest`(`CalEventDelete`,`POST /calendar/event/delete`)有两种用法:传 `EventID` 删除单条事件;省略 `EventID` 并同时传 `StartAt` 与 `EndAt`(`YYYY-MM-DD`,`EndAt` 为开区间)则清空该日历自身在这段日期上的事件,被清空的日期回落到关联的节假日日历与每周工作日。两者二选一,`CalID` 始终必填。
+
+`CalEventUpsert`(`POST /calendar/event/upsert`)在 `[StartAt, EndAt)` 上创建或更新一条该日历自有的事件(`IsOff` 为 true 表示休息日,false 表示工作日覆盖):省略 `EventID` 即新建,传入的 `EventID` 必须是该日历已有的自身事件。写入会先把该日历自己的其他事件从同一段日期上摘掉——完全落在范围内的事件被删除,部分重叠的被截短,跨越整个范围的被拆成两段——因此这些日期以最后一次写入为准。`EndAt` 必须晚于 `StartAt`;`Summary` 为选填。
+
+`CalEventList`(`POST /calendar/event/list`)用 `CalEventListRequest` 的 `Year` / `Month` / `Day` 划定范围(`Month` 与 `Day` 都为 0 时返回整年)。响应 `CalEventListResponse` 除 `Items`(按 `StartAt` 排序的事件)与 `Total` 外,还有一个必填的 `Days`:`map[string]CalDay`,键为 `YYYY-MM-DD`,给出该范围内每一天的最终状态。每个 `CalDay` 给出 `IsOff`、`EventID`(决定这一天的事件,没有任何事件覆盖时为空)与 `Layer`(`custom` / `holiday` / `weekly`)。日期按层优先级判定:该日历自有事件(`custom`)高于关联的节假日日历(`holiday`),再高于每周工作日(`weekly`);同一层内工作日事件优先于休息日,因此节假日日历里的调休补班日会盖过节假日休息日。没有任何事件覆盖的日期为工作日。
+
+### 故障工作项
+
+`client.Incidents` 的 `WorkItem*` 方法(`/incident/work-item/*`)管理故障的行动项与复盘跟进项。工作项状态是封闭枚举:`CreateWorkItemRequest` / `UpdateWorkItemRequest` 的 `Status` 与 `ConvertWorkItemRequest` 的 `TargetStatus` 只接受 `open`、`in_progress`、`done`、`cancelled`,创建时省略或留空即取 `open`,`TargetStatus` 为选填。`WorkItemComplete` 的 `CompleteWorkItemRequest.TargetStatus` 只接受 `done`,传其他值一律被拒绝。
+
## 响应时间戳
响应中的时间字段不再是裸整数,而是自描述的 `Timestamp`(Unix 秒)或 `TimestampMilli`(毫秒)类型(请求与响应共用的类型是例外,见下方警告)。它们序列化为本地时区的 RFC3339 字符串,因此 JSON、日志以及面向 LLM 的输出都直接可读;原始 epoch 仍只需一次方法调用即可取到。
diff --git a/zh/monitors/alert-rules/investigation-entries.mdx b/zh/monitors/alert-rules/investigation-entries.mdx
index 627769f32..04642eed4 100644
--- a/zh/monitors/alert-rules/investigation-entries.mdx
+++ b/zh/monitors/alert-rules/investigation-entries.mdx
@@ -49,7 +49,7 @@ keywords: ["调查入口", "排查入口", "告警规则", "仪表盘入口", "
| 字段 | 必填 | 说明 |
|------|------|------|
| **调查用途** | 否 | 一句话说明这个入口帮助确认什么。单行纯文本,换行符会被替换为空格;控制台把输入框限制为 200 个字符,后端同时按 **≤512 字节** 校验。用途**不渲染模板**,也不参与去重身份(两个入口只有用途不同仍然算重复)。它面向值班人员展示,也供 AI SRE 判断每个入口的意图 |
-| **时间范围** | 是 | 「**告警前** N **分钟,至告警后** M **分钟**」,新建入口默认为告警前 60 分钟、告警后 0 分钟。两个方向都必须非负,且至少一个大于 0 |
+| **时间范围** | 是 | 「**告警前** N **分钟,至告警后** M **分钟**」,新建入口默认为告警前 60 分钟、告警后 30 分钟。两个方向都必须非负,且至少一个大于 0 |
时间范围的语义:
@@ -62,7 +62,7 @@ keywords: ["调查入口", "排查入口", "告警规则", "仪表盘入口", "
| 字段 | 说明 |
|------|------|
-| **仪表盘** | 按标题或描述搜索并选择仪表盘;选中后下方会显示它所在的分组路径。**更换仪表盘会清空定位对象与变量取值**(它们都属于旧仪表盘) |
+| **仪表盘** | 按标题或描述搜索并选择仪表盘;选中后下方会显示它所在的分组路径。打开选择器时默认列出**规则所在分组**的仪表盘(每页 20 条,点 `加载更多仪表盘` 继续加载),输入关键词后改为按标题或描述跨分组搜索。**更换仪表盘会清空定位对象与变量取值**(它们都属于旧仪表盘) |
| **定位到** | `整个仪表盘`,或仪表盘内的某个标签页 / 分组 / 图表,选项后跟完整路径面包屑。整个仪表盘的入口打开仪表盘本身 |
| **变量取值** | 该仪表盘的每个模板变量一个输入框;留空表示使用仪表盘自己的默认值 |
@@ -120,11 +120,20 @@ outcome:="failure"
## 预览跳转
-点击入口右侧的眼睛图标打开 **预览调查入口** 弹窗,它按真实事件的快照渲染这个入口,用来在保存前确认跳转是否符合预期。
+点击入口右侧的眼睛图标打开 **预览调查入口** 弹窗。弹窗按入口是否使用模板变量选择预览方式。
+
+**不使用模板变量的入口:按当前配置静态预览。** 入口的仪表盘变量取值和查询语句里都没有 `{{` 时,弹窗直接用表单里的**当前配置和当前时间**渲染这个入口,**包含尚未保存的修改**。这既不需要规则已保存,也不需要规则有活跃告警。窗口以打开弹窗的时刻为锚点:开始 = 当前时间 − 告警前时长,结束 = 当前时间 + 告警后时长。
+
+- 查询入口没有指定数据源、而规则匹配到多个数据源时,弹窗顶部会出现 **预览数据源** 选择框,选项是该规则匹配到的数据源。没有选定之前不渲染预览,并提示 `请选择预览数据源。`。
+- 规则当前没有匹配到任何数据源时提示 `该规则暂无匹配的数据源,请先配置规则数据源。`,此时先到「数据源与查询」配置规则的数据源。
+- 仪表盘入口还没有选择仪表盘、或查询入口没有可用的数据源时,弹窗里没有可预览的内容。
+
+**使用模板变量的入口:按真实告警的事件快照预览。** 只要入口的任一仪表盘变量取值或查询语句里出现 `{{`,弹窗就改用告警快照渲染:
- 前置条件:**规则必须已经保存**(否则提示 `请先保存规则,产生告警后再预览`),并且该规则**当前有活跃告警**(否则提示 `该规则暂无活跃告警,产生告警后可预览`)。弹窗顶部从该规则的活跃告警里选一条作样本,超过 20 条时可以翻页。
- 预览用的是所选告警的**事件快照**,**不包含表单里尚未保存的修改**;因此要先保存规则、等它产生告警,才能预览新改的配置。
-- 弹窗里点入口再打开目标(新页签)。如果这条告警没有与该入口对应的快照,会提示 `该告警中没有与此入口对应的快照,请选择配置生效后产生的告警`;整条告警都没有快照时提示 `该告警没有调查入口快照,请选择配置生效后产生的告警`。
+
+两种方式下都可以在弹窗里点入口打开目标(新页签)。快照方式下,如果这条告警没有与该入口对应的快照,会提示 `该告警中没有与此入口对应的快照,请选择配置生效后产生的告警`;整条告警都没有快照时提示 `该告警没有调查入口快照,请选择配置生效后产生的告警`。
## 校验与限制
diff --git a/zh/monitors/dashboards/dashboards.mdx b/zh/monitors/dashboards/dashboards.mdx
index 0bb45debb..8146a0b9b 100644
--- a/zh/monitors/dashboards/dashboards.mdx
+++ b/zh/monitors/dashboards/dashboards.mdx
@@ -17,8 +17,9 @@ keywords: ["仪表盘", "Dashboard", "面板", "模板变量", "同环比", "版
页面左侧是与告警规则共用的目录树,右侧是当前目录下的仪表盘。目录的创建、重命名、移动和删除都在树上完成,规则见[文件夹管理](/zh/monitors/folders/folders)。
-- 左侧目录上方输入框的搜索只在**当前目录**内进行;搜索词和页码会保留在页面地址中,链接可以分享,从仪表盘返回列表时也会还原。
-- 页面右上角的 **全局搜索** 则在当前账号所有可读目录里查找仪表盘(可读范围由后端按权限过滤),不受当前所在目录限制:匹配仪表盘的**标题或描述**,多个关键词用空格分隔;每条结果给出标题、所在目录路径和描述,点击即可打开该仪表盘;结果每页 20 条,请求失败时可以点 **重试**。这个弹窗的搜索状态只存在于弹窗内,关闭即丢弃,也不会写入页面地址。
+- 左侧目录上方输入框的搜索只在**当前目录**内进行;搜索词和页码会保留在页面地址中,链接可以分享,从仪表盘返回列表时也会还原;每页条数的选择则记在浏览器本地,下次打开这个列表时沿用。
+- 页面右上角的 **搜索全部仪表盘** 则在当前账号所有可读目录里查找仪表盘(可读范围由后端按权限过滤),不受当前所在目录限制:匹配仪表盘的**标题或描述**,多个关键词用空格分隔,关键词最长 128 个字符;每条结果给出标题与所在目录路径(目录较长时会换行完整显示),点击即可打开该仪表盘;结果每页 20 条,请求失败时可以点 **重试**。它不是一个弹窗,而是就地展开的搜索框,结果出现在它下方的下拉面板里;搜索状态只存在于这个搜索框内,点右侧的 ✕、按 `Esc` 或点击面板外部即关闭,关闭即丢弃,也不会写入页面地址。
+- 打开搜索框但还没输入关键词时,面板会列出**最近打开**的 5 个仪表盘(标题 + 完整目录路径),点击其中一个即可打开,并把它移到列表最前。这份记录只保存在当前账号的浏览器本地,不会上传到服务端,可用 **清除记录** 清空。
- 每行的 **更多** 菜单提供:移动到其他分组、克隆到本分组、克隆到其他分组。克隆会生成一个标题带“副本”后缀的新仪表盘,**不带历史版本**;移动或克隆到其他目录时,您需要对目标目录可读。
## 新建与保存仪表盘
@@ -270,3 +271,4 @@ keywords: ["仪表盘", "Dashboard", "面板", "模板变量", "同环比", "版
| 保留的历史版本 | 20 |
| 回收站保留时长 | 30 天 |
| 单个仪表盘定义 | 1 MiB |
+| 搜索全部仪表盘的关键词长度 | 128 个字符 |
diff --git a/zh/monitors/data-sources/data-sources.mdx b/zh/monitors/data-sources/data-sources.mdx
index 49967c184..fbda56708 100644
--- a/zh/monitors/data-sources/data-sources.mdx
+++ b/zh/monitors/data-sources/data-sources.mdx
@@ -41,7 +41,7 @@ Monitors 支持以下 15 种数据源类型:
- **关联告警引擎**:负责查询的引擎集群及其在线状态
- **启用数据源**:开启或停用该数据源,见[启用与告警评估](#启用与告警评估)
-可以按名称、类型、连接地址或备注搜索。列表每 5 秒自动刷新引擎连接状态。
+可以按名称、类型、连接地址或备注搜索。列表每 5 秒自动刷新引擎连接状态。每页条数的选择记在浏览器本地,下次打开这个列表时沿用。
## 数据源权限(团队授权)
diff --git a/zh/monitors/engine/engine-lost-alert.mdx b/zh/monitors/engine/engine-lost-alert.mdx
index 9d15d9ad1..b2a772722 100644
--- a/zh/monitors/engine/engine-lost-alert.mdx
+++ b/zh/monitors/engine/engine-lost-alert.mdx
@@ -14,7 +14,7 @@ keywords: ["引擎失联", "告警引擎", "monitedge", "失联告警", "健康
## 告警规则列表
-列表展示已配置的规则及其主要参数(含义见下文 [新建告警规则](#新建告警规则)),支持按关键字搜索、自定义显示列,并可用开关直接启用或禁用规则。
+列表展示已配置的规则及其主要参数(含义见下文 [新建告警规则](#新建告警规则)),支持按关键字搜索、自定义显示列,并可用开关直接启用或禁用规则。每页条数的选择,以及列的显隐与顺序,都记在浏览器本地,下次打开这个列表时沿用。
## 新建告警规则
diff --git a/zh/monitors/engine/engine.mdx b/zh/monitors/engine/engine.mdx
index 199a2faa2..ceef13a55 100644
--- a/zh/monitors/engine/engine.mdx
+++ b/zh/monitors/engine/engine.mdx
@@ -12,7 +12,7 @@ keywords: ["告警引擎", "monitedge", "引擎安装", "引擎状态", "API Key
## 告警引擎状态
-展示所有已注册的告警引擎实例信息,列表每 5 秒自动刷新。
+展示所有已注册的告警引擎实例信息,列表每 5 秒自动刷新。每页条数的选择记在浏览器本地,下次打开这个列表时沿用。
| 列信息 | 说明 |
|--------|------|
diff --git a/zh/monitors/explore/explore.mdx b/zh/monitors/explore/explore.mdx
index 506b6ba85..0fca8b1dd 100644
--- a/zh/monitors/explore/explore.mdx
+++ b/zh/monitors/explore/explore.mdx
@@ -38,7 +38,7 @@ keywords: ["查询工作台", "Explore", "即时查询", "Prometheus", "Loki", "
- **Prometheus**:上下分屏,上方折线图(Graph)、下方原始样本(Raw),支持拖拽分隔。
- **其他数据源**:单结果区,根据查询类型展示日志视图、表格视图或样本视图。
-样本视图每页 20 条;表格视图默认每页 100 条,可切换为 200 或 500 条。
+样本视图默认每页 20 条;表格视图默认每页 100 条,可切换为 200 或 500 条。两类视图的每页条数由浏览器记住,刷新页面或重新查询后仍沿用上次的选择,只有排序会随新的结果重置。
### 图表功能
diff --git a/zh/monitors/folders/folders.mdx b/zh/monitors/folders/folders.mdx
index 4f25302f7..81ad98376 100644
--- a/zh/monitors/folders/folders.mdx
+++ b/zh/monitors/folders/folders.mdx
@@ -29,6 +29,25 @@ Monitors 使用树形文件夹结构来组织和管理告警规则。每条告
| **更新时间** | 最后修改时间 |
| **创建时间** | 创建时间 |
+## 移动规则到其他文件夹
+
+您可以把告警规则移到别的文件夹。规则本身不变,只是换了归属。
+
+- **单条规则**:点击行尾 `⋮` 菜单里的 **移动**。
+- **多条规则**:勾选规则后,点击列表上方的 **移动**。
+
+两种入口都打开 **移动到其他分组** 对话框:
+
+| 操作 | 说明 |
+|------|------|
+| **搜索分组** | 输入关键词按名称过滤文件夹树(不区分大小写),命中结果保留完整层级路径。输入会清空已选中的文件夹 |
+| 选择文件夹 | 在树里点击目标文件夹;对话框只列出您有权访问的文件夹 |
+| **确定** | 打开对话框时没有预选文件夹。未选择文件夹、或选中的就是当前文件夹时按钮保持禁用;树加载中或加载失败时同样禁用 |
+
+文件夹树加载失败时会显示 `加载分组失败` 和 **重试**。
+
+移动成功后提示 `移动成功`,列表自动刷新。失败时提示 `移动失败`,规则仍留在原文件夹;例如您对目标文件夹没有操作权限时会这样。目标文件夹里已经存在同名规则时,该规则不会被移动。
+
## 团队访问控制
文件夹支持基于团队的访问控制,通过为文件夹绑定团队来限制操作权限。
diff --git a/zh/monitors/quickstart/quickstart.mdx b/zh/monitors/quickstart/quickstart.mdx
index 6c305922f..d31a45082 100644
--- a/zh/monitors/quickstart/quickstart.mdx
+++ b/zh/monitors/quickstart/quickstart.mdx
@@ -213,9 +213,9 @@ keywords: ["入门指南", "monitedge", "数据源", "告警规则", "快速开
| **添加仪表盘入口** | 选择仪表盘并可定位到整个仪表盘、某个标签页、分组或图表,同时为该仪表盘的模板变量指定取值 |
| **添加查询入口** | 保存一份初始查询(数据源 + 查询类型 + 查询语句 + 查询参数),默认在告警事件自己的数据源上执行 |
| **调查用途** | 一句话说明这个入口帮助确认什么,可选 |
-| **时间范围** | 「告警前 N 分钟,至告警后 M 分钟」,以告警事件时间为锚点,默认告警前 60 分钟、告警后 0 分钟 |
+| **时间范围** | 「告警前 N 分钟,至告警后 M 分钟」,以告警事件时间为锚点,默认告警前 60 分钟、告警后 30 分钟 |
-最多 20 个入口,可以拖动调整顺序(顺序只影响展示);点击入口右侧的眼睛图标可以按该规则的一条真实告警**预览跳转**。入口随规则保存生效,渲染成快照后随告警事件下发,因此改规则不会影响已经产生的告警。
+最多 20 个入口,可以拖动调整顺序(顺序只影响展示);点击入口右侧的眼睛图标可以**预览跳转**:不使用模板变量的入口按当前表单配置和当前时间预览,使用模板变量的入口按该规则的一条真实告警快照预览。入口随规则保存生效,渲染成快照后随告警事件下发,因此改规则不会影响已经产生的告警。
保存调查入口需要 monit-edge `v0.75.3` 或以上版本:保存时会检查该规则匹配到的数据源所在集群内所有活跃实例,只要有实例低于该版本,保存即被拒绝。
@@ -302,7 +302,9 @@ keywords: ["入门指南", "monitedge", "数据源", "告警规则", "快速开
### 批量移动
-勾选多条规则后,可以将它们批量移动到其他文件夹中。
+勾选多条规则后,点击列表上方的 **移动**,将它们批量移动到其他文件夹。只移动一条时,点击该行行尾 `⋮` 菜单里的 **移动**。
+
+两种入口都打开 **移动到其他分组** 对话框:在树里选择目标文件夹,或先在 **搜索分组** 框里按名称过滤(输入会清空已选中的文件夹);选中的就是当前文件夹时 **确定** 保持禁用。成功后提示 `移动成功` 并刷新列表。详见[文件夹管理](/zh/monitors/folders/folders)。
## 导入告警规则
diff --git a/zh/on-call/channel/create-edit.mdx b/zh/on-call/channel/create-edit.mdx
index 538cf1f29..142cfe2f9 100644
--- a/zh/on-call/channel/create-edit.mdx
+++ b/zh/on-call/channel/create-edit.mdx
@@ -213,6 +213,7 @@ keywords: ["协作空间", "创建管理", "业务隔离", "团队协作", "告
| **空间名称** | 按名称字典序排序 |
- 使用右上角 **排序** 功能进入排序模式,通过拖拽协作空间卡片调整显示顺序,排序结果对所有用户生效
+- 列表右下角的分页器可切换每页显示条数(12 / 24 / 48 / 96,默认 24),也可输入自定义条数,上限 100 条
### 变更配置
diff --git a/zh/on-call/channel/noise-reduction.mdx b/zh/on-call/channel/noise-reduction.mdx
index e527739c7..1cb0fa5fa 100644
--- a/zh/on-call/channel/noise-reduction.mdx
+++ b/zh/on-call/channel/noise-reduction.mdx
@@ -79,6 +79,37 @@ src="https://download.flashcat.cloud/flashduty/video/alert-aggr.mp4"

+## 让 AI 帮你配置降噪
+
+**告警聚合** 与 **抖动检测** 的页头右侧各有一个 **让 AI 帮我配置降噪** 按钮(与页面标题、描述同一行的右端)。点击后会在右侧打开 [AI SRE](/zh/ai-sre) 面板,把该协作空间作为上下文引用带入会话,并按您所在的页面预填一条请求:
+
+| 入口 | 预填的请求(以协作空间「生产环境」为例) |
+| :--- | :--- |
+| **告警聚合** | `/channel-noise 帮我分析协作空间「生产环境」的告警噪音,推荐并配置告警聚合` |
+| **抖动检测** | `/channel-noise 帮我分析协作空间「生产环境」里反复触发的告警,推荐并配置抖动检测` |
+
+引用标签的标题就是协作空间名,Agent 因此知道要处理哪个空间;`/channel-noise` 是对应的内置 [Skill](/zh/ai-sre/skills),只从这个入口进入,一次只调一个协作空间。预填的请求可以直接发送,也可以在发送前改写,例如限定回看的时间范围,或说明必须保留哪些聚合维度;发送后仍可继续用自然语言追问或调整要求。
+
+
+ **前提**:账户已启用 AI SRE,且您有使用 AI SRE 对话的权限。不满足任一条件时,该按钮不显示。
+
+
+之后 Agent 按以下步骤工作:
+
+
+
+ 拉取该协作空间最近的告警,回看范围可以调整,最长 30 天。它据此统计高频告警标题、同一标题在短时间内集中触发的爆发及其内部发生变化的标签、反复触发的 `alert_key`,以及各标签的覆盖率和取值数量。这一步只读。
+
+
+ 推荐聚合方式与聚合维度,或推荐抖动检测的观测窗口、状态变化次数与静默时长,并说明依据。在告警聚合页,它还会用页面自身的聚合预览试算候选维度,给出预计的故障数量与降噪幅度,而不是只给一般性建议。
+
+
+ 改动不会直接落库。Agent 可以把推荐值填进表单,由您检查后点 **保存**;也可以在您选择直接保存时调用页面自身的保存动作——此时会先给出一张确认卡片,逐条列出变更项与变更前后的值(如「聚合维度:`labels.check` → `labels.check` + `labels.service`」),确认后才写入。保存后立即生效,页面自动刷新。
+
+
+
+`/channel-noise` 只修改 **告警聚合** 与 **抖动检测** 两项配置;**事件聚合**、静默策略、抑制策略和排除规则它只给建议并指出对应的配置页面,不写入。引用标签如何随消息发送、会话如何管理,见 [控制台对话](/zh/ai-sre/sessions#附件与上下文引用)。
+
## 事件聚合
进入 协作空间详情 → **降噪处理** → **事件聚合** 进行配置。
diff --git a/zh/on-call/configuration/service-calendar.mdx b/zh/on-call/configuration/service-calendar.mdx
index 1b6ab4cb4..e8d3ec5af 100644
--- a/zh/on-call/configuration/service-calendar.mdx
+++ b/zh/on-call/configuration/service-calendar.mdx
@@ -23,7 +23,7 @@ keywords: ["服务日历", "工作日", "休息日", "节假日", "差异化处
## 创建日历
-进入 **配置中心 → 服务日历**,点击 **新增日历**。
+进入 **配置中心 → 服务日历**,点击 **创建**,在右侧面板 **创建服务日历** 中填写信息。
| 配置项 | 说明 |
| --- | --- |
@@ -46,8 +46,8 @@ keywords: ["服务日历", "工作日", "休息日", "节假日", "差异化处
| 操作 | 说明 |
| --- | --- |
| **修改基础信息** | 日历名称、描述、管理团队 |
-| **关联节假日** | 在日历详情页关联国家节假日日历,系统自动将法定假日标记为休息日、调休补班日标记为工作日,可随时调整或取消关联 |
-| **批量标记休息日** | 按星期几快速标记,如每周六、日为休息日 |
+| **关联节假日** | 在日历详情页关联国家节假日日历,系统自动将法定假日标记为休息日、调休补班日标记为工作日,可随时调整或取消关联。下拉中只列出当前界面语言对应的节假日日历(已关联的其他日历会保留在列表中,便于取消关联),可同时关联多个;点击勾选或取消即保存生效,无需另行保存 |
+| **批量标记休息日** | 按星期几快速标记,如每周六、日为休息日。一周至少保留一个工作日,当只剩最后一个工作日时它的按钮不可再切换为休息日;未设置任何休息日时七天全部按工作日计 |
| **调整日期** | 点击一个日期,或先后点击两个日期选中一段日期,在下方操作栏点击 **设为工作日**、**设为休息日** 或 **恢复默认**,备注选填 |

@@ -74,9 +74,11 @@ keywords: ["服务日历", "工作日", "休息日", "节假日", "差异化处
2. **关联的节假日日历**:调休补班日优先于节假日休息日
3. **每周休息日**:按星期几批量标记的休息日
+ 同一个日历内,同一天只保留最后一条手动设置。在已有设置覆盖到的日期上再次点击 **设为工作日** 或 **设为休息日**,旧设置会被本次写入覆盖:完全落在本次选中范围内的旧设置被删除,部分重叠的被截短,跨越整个范围的被拆成两段。
+
以上都没有设置的日期为工作日。对日期点击 **恢复默认** 会清除手动设置,该日期回到节假日日历和每周休息日的判定。
- 日历上黄色表示休息日,绿色表示手动设置或节假日补班的工作日,没有颜色的日期按每周设置为工作日。
+ 日历上黄色表示休息日,绿色表示手动设置或节假日补班的工作日,没有颜色的日期按每周设置为工作日。由本日历手动设置的日子还会额外描一圈边框,与节假日日历或每周规则决定的日子区分开;将鼠标悬停在某一天上,可以看到是哪一层决定了这一天,以及被它覆盖掉的设置(以删除线列出)。
diff --git a/zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx b/zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
index 32e81ffb5..785cd3001 100644
--- a/zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
+++ b/zh/on-call/integration/alert-integration/alert-sources/aliyun-dataworks-op.mdx
@@ -69,7 +69,7 @@ DataWorks 智能监控自定义 Webhook 推送的消息统一包裹在 `message`
| `DataWorks_Baseline_Alert` | 基线告警 | 基线预警与破线 |
| `DataWorks_Event_Remind` | 事件告警 | 任务出错与变慢 |
-连通性测试消息仅用于验证推送地址,不会产生告警事件。
+连通性测试消息(`message.content` 非空)仅用于验证推送地址,不会产生告警事件。
@@ -117,6 +117,31 @@ DataWorks 智能监控 Webhook 属于**一次性事件**:官方协议只定义
+## 标签
+
+
+推送消息中的关键字段会作为标签保留在告警事件上,可用于路由、静默和通知模板渲染:
+
+| 标签 | 来源字段 | 说明 |
+| ---- | -------- | ---- |
+| `alert_type` | `message.title` | 告警类型,取值为 `DataWorks_Remind`、`DataWorks_Baseline_Alert` 或 `DataWorks_Event_Remind` |
+| `remind_name` | `remind_name` | 规则名称 |
+| `remind_unit` | `remind_unit` | 监控粒度:Task、Baseline、Project、BizProcess、ScheduleResourceGroup、DiResourceGroup |
+| `remind_type` | `remind_type` | 原始触发条件 |
+| `occur_time` | `occur_time` | 原始发生时间字符串,格式 `2021-07-13 16:16:20`;三类告警都会生成 |
+| `remind_founder` | `remind_founder` | 规则创建人 |
+| `more_information` | `more_information` | 运维中心周期实例 URL |
+| `task_size` / `number_of_alerts` | 同名字段 | 任务数量、第几次告警;任务数量大于 0、告警次数大于 0 时才生成 |
+| `node_id_list` / `node_name_list` / `node_owner_list` | 同名字段 | 节点 ID、节点名、责任人列表,英文逗号分隔、最多 5 个;非资源组监控时生成 |
+| `resource_group_name` / `threshold` / `duration` | 同名字段 | 资源组名、阈值、持续时间(分钟);仅资源组监控时生成 |
+| `baseline_name` / `baseline_owners` | 同名字段 | 基线名、基线责任人 |
+| `cycle_number` / `key_instance` / `sla_time` / `buffer` / `status` | 同名字段 | 周期号(天基线为 1)、当前关键实例、承诺时间、基线余量(分钟)、基线状态(`dangerous` 为预警、`overSla` 为破线) |
+| `task_name` / `task_owner_name` / `event_type` / `event_name` | 同名字段 | 异常任务名、任务责任人、事件类型(`ERROR` 出错、`SLOW` 变慢)、事件名称 |
+
+空值字段不会生成标签。告警标题取自各告警族的名称字段:自定义告警取 `remind_name`,基线告警取 `baseline_name`,事件告警取 `task_name`。
+
+
+
## 常见问题
diff --git a/zh/openapi/api-catalog.mdx b/zh/openapi/api-catalog.mdx
index 9ab867e9c..d209eb493 100644
--- a/zh/openapi/api-catalog.mdx
+++ b/zh/openapi/api-catalog.mdx
@@ -510,7 +510,7 @@ Flashduty Open API 提供 **365** 个接口,覆盖 On-call、Monitors、RUM、
| `query` | string | 消息文本,与发送回执帧一致 |
| `parts` | array | 消息携带的 parts(`text` / `file` / `ref` / `skill`,原样透传,可选) |
-只有「普通人类消息」会被投影:带 `source` 的内部生产者消息(自动化、子会话通知、父会话初启消息等)与提问作答(`function_response`)所在的消息不在其中;队列读取失败时降级为空数组,不会导致请求失败。该投影与 `user_message_enqueued` 帧的载荷一致,用于渲染「已发送但尚未被处理」的待处理气泡。
+只有「普通人类消息」会被投影:带 `source` 的内部生产者消息(自动化、子会话通知、父会话初启消息等)、提问作答(`function_response`)与页面动作的批量回执(`function_responses`)所在的消息都不在其中;队列读取失败时降级为空数组,不会导致请求失败。该投影与 `user_message_enqueued` 帧的载荷一致,用于渲染「已发送但尚未被处理」的待处理气泡。
### 自动化
diff --git a/zh/rum/explorer/data-query.mdx b/zh/rum/explorer/data-query.mdx
index 2ab563403..c05ef5055 100644
--- a/zh/rum/explorer/data-query.mdx
+++ b/zh/rum/explorer/data-query.mdx
@@ -94,6 +94,7 @@ RUM 查看器的查询由**词项**(terms)和**操作符**(operators)组
|----------|------|
| `browser_name:Chrome` | 检索值为 `Chrome` 的浏览器 |
| `view_name:*/detail` | 检索以 `/detail` 结尾的视图名称 |
+| `browser_name:*` | 检索包含该字段的事件:`*` 单独作为整个值表示字段存在(`IS NOT NULL`),不是通配符 |
| `-resource_status_code:0` | 检索状态码不为 `0` 的资源 |
| `os_name:"Mac OS X"` | 检索值为 `"Mac OS X"` 的系统名称 |
diff --git a/zh/rum/quickstart/app-management.mdx b/zh/rum/quickstart/app-management.mdx
index f1e9d2172..b7509692c 100644
--- a/zh/rum/quickstart/app-management.mdx
+++ b/zh/rum/quickstart/app-management.mdx
@@ -27,6 +27,8 @@ RUM 应用是承载前端性能监控数据的容器,用于采集、存储和
私有应用中,其他成员若需查看内容,可以通过分享故障链接的方式临时授权访问。
+除可见范围外,这层读权限还会落到数据查询上:查看器的查询与数据查询接口(`POST /rum/data/query`)返回的事件数据同样按应用读权限过滤。如果查询中显式点名了您读不到的应用,整批查询会直接失败,而不是只丢弃那部分数据;如果查询没有点名任何应用,服务端会自动从结果中排除您读不到的应用(私有应用中您既不是创建者、也不在其管理团队内的那些)以及已删除的私有应用。账户所有者与账户管理员可以读取账户内的全部应用,因此对他们不会有任何数据被排除。单次请求最多可点名 50 个应用,超过上限时整批查询返回参数错误。
+
## 创建应用