@thinkingai/ae-cli 6.0.32 → 6.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +3 -2
  2. package/README.zh.md +3 -2
  3. package/dist/{auth-MEJ642P4.js → auth-ENM3FE6L.js} +3 -2
  4. package/dist/{auth-7H3HAAJ3.js → auth-UPGUOKTW.js} +13 -6
  5. package/dist/{capability-QW4AVJHI.js → capability-AJC5CBRT.js} +49 -17
  6. package/dist/{capability-SCRFGODD.js → capability-TQ5KU5Q6.js} +49 -17
  7. package/dist/chunk-24BAVOX3.js +51 -0
  8. package/dist/{chunk-MDJGDI6K.js → chunk-3KI3RRXX.js} +5 -5
  9. package/dist/{chunk-PKRD2IEM.js → chunk-3P3562ZX.js} +9 -7
  10. package/dist/{chunk-R77JT7XD.js → chunk-4Q5TNP4Q.js} +4 -4
  11. package/dist/{chunk-7OLGDQQ2.js → chunk-6CHYBI64.js} +2 -2
  12. package/dist/{chunk-6LEYLOV3.js → chunk-CPVTECJ3.js} +9 -7
  13. package/dist/{chunk-KCA6BA5D.js → chunk-DB4Q3ANU.js} +5 -3
  14. package/dist/{chunk-2NDGFQHW.js → chunk-E7UXXHO3.js} +11 -3
  15. package/dist/{chunk-I4A62X3N.js → chunk-HQ2A7ITL.js} +23 -14
  16. package/dist/chunk-IMMGMU54.js +674 -0
  17. package/dist/{chunk-AJTH7LT3.js → chunk-IR4ZLVPW.js} +4 -2
  18. package/dist/{chunk-TBHBYKXZ.js → chunk-ISY6HMHM.js} +2 -2
  19. package/dist/{chunk-KGJQCYVC.js → chunk-LCXU3AAT.js} +4 -2
  20. package/dist/chunk-LYVNONC4.js +86 -0
  21. package/dist/{chunk-DYOS6YY7.js → chunk-RGXCNC4N.js} +23 -14
  22. package/dist/{chunk-YCLVYFK7.js → chunk-V6FR6WTW.js} +45 -87
  23. package/dist/chunk-VTWMIC5L.js +27 -0
  24. package/dist/{cli-token-TVQRSE46.js → cli-token-4SBMXAUK.js} +6 -3
  25. package/dist/{client-2643Z5AG.js → client-PP5FETMW.js} +4 -3
  26. package/dist/community-report-client-KK2QBANO.js +145 -0
  27. package/dist/{config-7UZWDE74.js → config-RCCGHHYA.js} +6 -3
  28. package/dist/index.js +505 -220
  29. package/dist/{metadata-BFDL6RUK.js → metadata-3M5F2AED.js} +14 -13
  30. package/dist/{metadata-FCLDBXX2.js → metadata-W2MEOI4Z.js} +14 -13
  31. package/dist/{model-T3KZJWLW.js → model-OYQLXCQY.js} +3 -2
  32. package/dist/{raw-CN542NGT.js → raw-TPB7KSZO.js} +6 -4
  33. package/dist/{sync-ERNHDPB5.js → sync-EFJKFZK2.js} +6 -3
  34. package/dist/{te-agent-FCCWUDTJ.js → te-agent-K2OWMZXT.js} +3 -2
  35. package/dist/{te-analysis-PUVF5IF4.js → te-analysis-I73ZS4NK.js} +903 -33
  36. package/dist/{te-analysis-UJDOKPAN.js → te-analysis-Q7AZCDU4.js} +903 -33
  37. package/dist/{te-common-XLAGWNIV.js → te-common-ST3QPSXJ.js} +7 -6
  38. package/dist/{te-common-VUX3VOXZ.js → te-common-WSLIKKPC.js} +7 -6
  39. package/dist/te-community-WXGB6IOX.js +1659 -0
  40. package/dist/te-community-X2AHXGCA.js +1659 -0
  41. package/dist/{te-dataops-ZNJBQ6VT.js → te-dataops-MJV54MNY.js} +10 -8
  42. package/dist/{te-dataops-F36T656A.js → te-dataops-OA7I6HBG.js} +10 -8
  43. package/dist/{te-engage-QBCCME22.js → te-engage-2FSDUOIZ.js} +973 -1585
  44. package/dist/{te-engage-K4AEUPK5.js → te-engage-BMJ6UOUU.js} +973 -1585
  45. package/dist/{te-kb-AYCODNU6.js → te-kb-E7NSCBRB.js} +74 -12
  46. package/dist/{te-meta-UUROEODR.js → te-meta-Q4L6EE3Q.js} +7 -6
  47. package/dist/{te-meta-ARDIW3YI.js → te-meta-VHCN4Q62.js} +7 -6
  48. package/dist/{te-team-OKCOX7OE.js → te-team-PDKKW7Q5.js} +7 -6
  49. package/dist/tracking/i18n/resources/cli/en.json +4 -3
  50. package/dist/tracking/i18n/resources/cli/ja.json +4 -3
  51. package/dist/tracking/i18n/resources/cli/ko.json +4 -3
  52. package/dist/tracking/i18n/resources/cli/zh.json +4 -3
  53. package/package.json +6 -2
  54. package/skills/ae-agent/SKILL.md +2 -1
  55. package/skills/ae-analysis/SKILL.md +12 -1
  56. package/skills/ae-analysis/references/adhoc_export.md +2 -0
  57. package/skills/ae-analysis/references/adhoc_run.md +2 -0
  58. package/skills/ae-analysis/references/alert_create.md +25 -0
  59. package/skills/ae-analysis/references/alert_definition_schema_get.md +24 -0
  60. package/skills/ae-analysis/references/alert_delete.md +26 -0
  61. package/skills/ae-analysis/references/alert_detail_list.md +27 -0
  62. package/skills/ae-analysis/references/alert_get.md +25 -0
  63. package/skills/ae-analysis/references/alert_job_list.md +24 -0
  64. package/skills/ae-analysis/references/alert_list.md +27 -0
  65. package/skills/ae-analysis/references/alert_notice_config_list.md +24 -0
  66. package/skills/ae-analysis/references/alert_start.md +25 -0
  67. package/skills/ae-analysis/references/alert_stop.md +25 -0
  68. package/skills/ae-analysis/references/alert_update.md +26 -0
  69. package/skills/ae-analysis/references/bi_panel_create.md +3 -3
  70. package/skills/ae-analysis/references/check_delete.md +27 -0
  71. package/skills/ae-analysis/references/check_export.md +27 -0
  72. package/skills/ae-analysis/references/check_get.md +27 -0
  73. package/skills/ae-analysis/references/check_list.md +24 -0
  74. package/skills/ae-analysis/references/check_retry.md +27 -0
  75. package/skills/ae-analysis/references/check_run.md +25 -0
  76. package/skills/ae-analysis/references/command_index.md +61 -27
  77. package/skills/ae-analysis/references/dashboard_create.md +3 -3
  78. package/skills/ae-analysis/references/dashboard_daily_report_send.md +1 -0
  79. package/skills/ae-analysis/references/dashboard_daily_report_update.md +2 -0
  80. package/skills/ae-analysis/references/dashboard_report_data_export.md +3 -3
  81. package/skills/ae-analysis/references/dashboard_report_data_run.md +3 -3
  82. package/skills/ae-analysis/references/event_blacklist_add.md +25 -0
  83. package/skills/ae-analysis/references/event_blacklist_list.md +24 -0
  84. package/skills/ae-analysis/references/event_blacklist_update.md +26 -0
  85. package/skills/ae-analysis/references/ingest_error_list.md +27 -0
  86. package/skills/ae-analysis/references/ingest_summary.md +26 -0
  87. package/skills/ae-analysis/references/live_data_export.md +27 -0
  88. package/skills/ae-analysis/references/live_data_list.md +27 -0
  89. package/skills/ae-analysis/references/plan_change_log_export.md +27 -0
  90. package/skills/ae-analysis/references/plan_change_log_list.md +24 -0
  91. package/skills/ae-analysis/references/plan_delete_items.md +30 -0
  92. package/skills/ae-analysis/references/plan_export.md +26 -0
  93. package/skills/ae-analysis/references/plan_generate.md +27 -0
  94. package/skills/ae-analysis/references/plan_get.md +24 -0
  95. package/skills/ae-analysis/references/plan_import_excel.md +26 -0
  96. package/skills/ae-analysis/references/plan_save_items.md +27 -0
  97. package/skills/ae-analysis/references/plan_sync_from_meta.md +24 -0
  98. package/skills/ae-analysis/references/project_role_delete.md +4 -3
  99. package/skills/ae-analysis/references/project_role_get.md +4 -3
  100. package/skills/ae-analysis/references/project_role_user_list.md +4 -3
  101. package/skills/ae-analysis/references/query_create_result_cluster.md +2 -1
  102. package/skills/ae-analysis/references/report_data_export.md +3 -1
  103. package/skills/ae-analysis/references/report_data_run.md +12 -2
  104. package/skills/ae-analysis/references/sdk_sample_generate.md +24 -0
  105. package/skills/ae-analysis/references/user_cluster_create.md +2 -0
  106. package/skills/ae-analysis/references/user_cluster_create_id.md +2 -0
  107. package/skills/ae-analysis/references/user_cluster_update.md +2 -0
  108. package/skills/ae-analysis/references/user_cluster_update_id.md +2 -0
  109. package/skills/ae-analysis/references/user_tag_create.md +2 -0
  110. package/skills/ae-analysis/references/user_tag_create_id.md +2 -0
  111. package/skills/ae-analysis/references/user_tag_update.md +2 -0
  112. package/skills/ae-analysis/references/user_tag_update_id.md +2 -0
  113. package/skills/ae-analysis-global/SKILL.md +2 -0
  114. package/skills/ae-capability/SKILL.md +7 -5
  115. package/skills/ae-community/SKILL.md +72 -8
  116. package/skills/ae-community/references/community-chat-analysis.md +341 -0
  117. package/skills/ae-community/references/community-data-report.md +301 -0
  118. package/skills/ae-dataops/SKILL.md +2 -1
  119. package/skills/ae-engage/SKILL.md +129 -105
  120. package/skills/ae-engage/references/activity-activity-type.md +1 -1
  121. package/skills/ae-engage/references/activity-activity.md +1 -1
  122. package/skills/ae-engage/references/activity-approval.md +5 -7
  123. package/skills/ae-engage/references/activity-task.md +12 -18
  124. package/skills/ae-engage/references/activity-topic.md +39 -22
  125. package/skills/ae-engage/references/add-approver.md +4 -4
  126. package/skills/ae-engage/references/add-channel.md +10 -5
  127. package/skills/ae-engage/references/approval-approver-delete.md +1 -1
  128. package/skills/ae-engage/references/approver-list.md +4 -4
  129. package/skills/ae-engage/references/build-task-save-guide.md +13 -13
  130. package/skills/ae-engage/references/cancel-query-by-request-id.md +7 -6
  131. package/skills/ae-engage/references/channel-detail.md +14 -9
  132. package/skills/ae-engage/references/channel-list.md +15 -10
  133. package/skills/ae-engage/references/channel-mgmt.md +109 -0
  134. package/skills/ae-engage/references/channel-test-send.md +1 -1
  135. package/skills/ae-engage/references/channel-update-config.md +1 -1
  136. package/skills/ae-engage/references/channel_touch_limits_list.md +1 -1
  137. package/skills/ae-engage/references/client-param.md +34 -16
  138. package/skills/ae-engage/references/common-metric.md +85 -18
  139. package/skills/ae-engage/references/config-item-analysis-report.md +8 -27
  140. package/skills/ae-engage/references/config-item-strategy-comparison.md +7 -18
  141. package/skills/ae-engage/references/config-item-trigger-report.md +8 -35
  142. package/skills/ae-engage/references/delete-channel.md +5 -5
  143. package/skills/ae-engage/references/delete-flow.md +5 -5
  144. package/skills/ae-engage/references/flow-ab-split-node-report.md +11 -45
  145. package/skills/ae-engage/references/flow-detail.md +15 -10
  146. package/skills/ae-engage/references/flow-list.md +9 -4
  147. package/skills/ae-engage/references/flow-node-config-schema.md +9 -8
  148. package/skills/ae-engage/references/flow-node-detail-report.md +11 -46
  149. package/skills/ae-engage/references/flow-node-overview-report.md +11 -43
  150. package/skills/ae-engage/references/flow-process-report.md +12 -50
  151. package/skills/ae-engage/references/flow-update-remark.md +19 -0
  152. package/skills/ae-engage/references/manage-flow.md +19 -19
  153. package/skills/ae-engage/references/manage-task.md +5 -5
  154. package/skills/ae-engage/references/modify-flow-base-info.md +8 -8
  155. package/skills/ae-engage/references/preset-event.md +1 -1
  156. package/skills/ae-engage/references/push-language.md +1 -1
  157. package/skills/ae-engage/references/save-flow.md +54 -52
  158. package/skills/ae-engage/references/save-task.md +23 -17
  159. package/skills/ae-engage/references/scene-config-channel.md +90 -10
  160. package/skills/ae-engage/references/scene-config-group.md +1 -1
  161. package/skills/ae-engage/references/scene-config-item.md +27 -4
  162. package/skills/ae-engage/references/scene-config-metric.md +1 -1
  163. package/skills/ae-engage/references/scene-config-param.md +2 -2
  164. package/skills/ae-engage/references/scene-preset-metric.md +1 -1
  165. package/skills/ae-engage/references/scene-strategy.md +19 -3
  166. package/skills/ae-engage/references/scene-template.md +10 -4
  167. package/skills/ae-engage/references/task-data-detail.md +5 -67
  168. package/skills/ae-engage/references/task-data-overview.md +5 -35
  169. package/skills/ae-engage/references/task-detail.md +5 -5
  170. package/skills/ae-engage/references/task-experiment-report.md +5 -38
  171. package/skills/ae-engage/references/task-list.md +4 -4
  172. package/skills/ae-engage/references/task-metric-detail.md +5 -43
  173. package/skills/ae-engage/references/task-stats.md +5 -5
  174. package/skills/ae-engage/references/update-channel-status.md +6 -6
  175. package/skills/ae-engage/references/validate-flow-node-config.md +12 -11
  176. package/skills/ae-engage/references/whitelist-list.md +4 -4
  177. package/skills/ae-engage/references/whitelist.md +1 -1
  178. package/skills/ae-engage/references/workbench-workbench.md +1 -1
  179. package/skills/ae-generate-tracking-code/SKILL.md +4 -4
  180. package/skills/ae-generate-tracking-plan/SKILL.md +132 -11
  181. package/skills/ae-generate-tracking-plan/references/business-dimension-mapping.md +98 -33
  182. package/skills/ae-generate-tracking-plan/references/xlsx-schema.md +16 -14
  183. package/skills/ae-kb/SKILL.md +11 -6
  184. package/skills/ae-metadata/SKILL.md +2 -1
  185. package/skills/ae-team/SKILL.md +2 -1
  186. package/dist/chunk-NOO24N7W.js +0 -11
  187. package/dist/chunk-TNW2CI4W.js +0 -129
  188. package/dist/te-community-PEZ2VEF7.js +0 -687
  189. package/dist/te-community-TSKJ652U.js +0 -687
  190. package/skills/ae-engage/references/config-channel-detail.md +0 -31
  191. package/skills/ae-engage/references/config-channel-list.md +0 -26
  192. package/skills/ae-engage/references/config-item-detail.md +0 -29
  193. package/skills/ae-engage/references/config-item-list.md +0 -18
  194. package/skills/ae-engage/references/copy-config-template.md +0 -28
  195. package/skills/ae-engage/references/delete-config-channel.md +0 -23
  196. package/skills/ae-engage/references/delete-config-item.md +0 -24
  197. package/skills/ae-engage/references/engage-scene-config-item.md +0 -69
  198. package/skills/ae-engage/references/manage-strategy.md +0 -73
  199. package/skills/ae-engage/references/strategy-detail.md +0 -72
  200. package/skills/ae-engage/references/strategy-list.md +0 -20
  201. package/skills/ae-engage/references/update-config-channel-status.md +0 -31
@@ -18,6 +18,8 @@ Use this skill for progressive capability discovery and generic gateway invocati
18
18
 
19
19
  Never guess a capability ID, input field, enum value, resource ID, or project ID.
20
20
 
21
+ **CRITICAL — Host compat (do this first):** After each `ae-cli` run, check stderr and `_notice.host_compat`. If either is present, open the user reply with a short ⚠️ version warning and **quote the `npm i -g` / `npx skills add` (or update-cluster) lines verbatim**, then present the business result. Soft tip; `ok: true` can still carry the notice.
22
+
21
23
  ### On-demand pre-check (pick one)
22
24
 
23
25
  Motto: **validate = fix params; dry-run = confirm ready to run.**
@@ -41,14 +43,14 @@ Create or keep a standalone reference only when at least one applies: L2 hard ba
41
43
  ## Commands
42
44
 
43
45
  ```bash
44
- # List summaries for one capability namespace.
45
- ae-cli capability list --domain <domain>
46
+ # List company-level summaries, or the capabilities available in one project.
47
+ ae-cli capability list --domain <domain> [--project-id <id>]
46
48
 
47
49
  # Search capability IDs and descriptions. All terms must match.
48
- ae-cli capability search "<terms>" --domain <domain>
50
+ ae-cli capability search "<terms>" --domain <domain> [--project-id <id>]
49
51
 
50
52
  # Read input_schema, risk, auth, output, and dry-run support.
51
- ae-cli capability inspect <capability-id>
53
+ ae-cli capability inspect <capability-id> [--project-id <id>]
52
54
 
53
55
  # Optional — fix params only (gateway /validate). Curated: global --validate.
54
56
  ae-cli capability validate <capability-id> --input '<json-object>'
@@ -69,7 +71,7 @@ ae-cli capability run <capability-id> --input '<json-object>'
69
71
  - `@<path>`.
70
72
  - `-` to read JSON from stdin.
71
73
 
72
- The capability namespace is inferred from `<capability-id>` for `inspect`, `validate`, `dry-run`, and `run`. Use `--domain <domain>` only to override routing.
74
+ The capability namespace is inferred from `<capability-id>` for `inspect`, `validate`, `dry-run`, and `run`. Use `--domain <domain>` only to override routing. For `list`, `search`, and `inspect`, omit `--project-id` for company License/Feature visibility; pass it to include project membership, project Feature, and user permission filtering.
73
75
 
74
76
  ## validate vs dry-run
75
77
 
@@ -1,18 +1,21 @@
1
1
  ---
2
2
  name: ae-community
3
- version: 2.0.0
4
- description: "AE community analysis: post search, comment sentiment, topic trends, risky content, livestream data."
3
+ description: "AE community analysis and data reporting for posts, comments, topics, livestreams, customer-service chats, WeCom after-sales groups, and in-game chat. Use for community content insight, sentiment, intent, evidence drill-down, community data ingestion/import/submission, and WeCom chat data integration (社区数据上报、导入、提交社区数据、企微聊天数据接入)."
5
4
  ---
6
5
 
7
6
  # ae-community
8
7
 
9
- The AE Community domain provides social data analysis: post/video search, comment analytics, sentiment and topics, risk monitoring, and livestream metrics. Commands run as **`ae-cli community +<subcommand>`** — every community subcommand uses the **`+` prefix**.
8
+ Skill revision: 2.4.1.
10
9
 
11
- | Route (MCP) | CLI service | Responsibility |
12
- |-------------|-------------|----------------|
10
+ The AE Community domain provides social and chat data analysis plus validated community data reporting. Curated analysis commands run as **`ae-cli community +<subcommand>`**; chat analysis uses dynamic Capability Gateway commands; reporting uses the direct **`ae-cli community data report`** ingestion command.
11
+
12
+ | Route | CLI service | Responsibility |
13
+ |-------|-------------|----------------|
13
14
  | `community_content` | `community` | Posts, comments, corpus tags, search, livestream content, risk content |
14
15
  | `community_analysis` | `community` | Channel list, overview metrics, sentiment, tag trends |
15
16
  | `community_hot` | `community` | Daily summary, hot topics, topic drill-down |
17
+ | `community.chat.*` | `community` Capability Gateway | Chat overview, participant discovery, roster-driven service metrics, intent/risk drill-down, raw evidence |
18
+ | Direct ingestion data plane | `community data report` | Validate, normalize, and submit community records to an explicit Iris `/sync_content` endpoint |
16
19
 
17
20
  ---
18
21
 
@@ -26,11 +29,12 @@ Global parameters:
26
29
  |---|---|
27
30
  | `--format <json\|table>` | Output format. Default is JSON. |
28
31
  | `--jq <expr>` | jq filter expression for JSON output. |
29
- | `--host <url>` | Override the active AE host. Available on every command and may be placed after the subcommand, e.g. `ae-cli community +<command> --host <url>`. |
32
+ | `--host <url>` | Override the active AE host for analysis-side commands and place it after the subcommand, e.g. `ae-cli community +<command> --host <url>`. It is intentionally unavailable for `community data report`; use `--endpoint` there. |
30
33
 
31
34
  Output and errors:
32
- - Successful commands return machine-readable JSON by default.
35
+ - Successful commands return machine-readable JSON by default. Envelope may include optional `_notice.host_compat`.
33
36
  - Failed commands return `{ "ok": false, "error": { "type": "...", "message": "...", "hint": "..." } }` and exit non-zero.
37
+ - **CRITICAL — Host compat (do this first):** After each `ae-cli` run, check stderr and `_notice.host_compat`. If either is present, open the user reply with a short ⚠️ version warning and **quote the `npm i -g` / `npx skills add` (or update-cluster) lines verbatim**, then present the business result. Soft tip; `ok: true` can still carry the notice.
34
38
 
35
39
  Safety constraints:
36
40
  - Read commands can execute directly after required IDs and references are verified.
@@ -50,6 +54,7 @@ Typical use cases:
50
54
  - Track sentiment, keywords/tags, and macro overview metrics by time range
51
55
  - Monitor risky or moderated content
52
56
  - Analyze livestream rooms, sessions, and AI-generated session reports
57
+ - Analyze customer-service DMs, customer after-sales groups, and in-game chat
53
58
  - Produce daily/weekly/activity-style reports via composite references under `references/community-*.md`
54
59
 
55
60
  For per-command flags and copy-paste examples, use the files in [`references/`](references/).
@@ -67,6 +72,10 @@ For per-command flags and copy-paste examples, use the files in [`references/`](
67
72
 
68
73
  - **Lists (comma-separated):** e.g. `--channel-id-list 1,2,3`, `--keywords a,b`, `--sentiment-types 0,1`
69
74
  - **Dates:** `yyyy-MM-dd` for range endpoints (e.g. `--start-time`, `--end-time`, `--date`)
75
+ - **Data reporting:** `community data report` requires `--space-id`, `--channel-id`, and `--source-id` as positive int64 identifiers. Here `--space-id` maps to Iris `game_id`.
76
+ - **Reporting endpoint:** use `--endpoint` or `AE_IRIS_SYNC_ENDPOINT`. `--host` does not select, derive, or modify the ingestion endpoint.
77
+ - **Reporting input:** use exactly one mode: `--data-type <type> --data <inline|path|@path|->`, or `--payload <inline|path|@path|->`.
78
+ - **Reporting schema:** run `ae-cli community data report --help` before building input to check the required record fields for every supported `data_type`; use the reporting reference for field limits and normalization behavior.
70
79
 
71
80
  ---
72
81
 
@@ -97,6 +106,8 @@ Route users to composite workflows when intent matches:
97
106
  | Single topic timeline + actions | [`community-hottopic-insight.md`](references/community-hottopic-insight.md) |
98
107
  | Official post taxonomy | [`community-analyzing-official-content.md`](references/community-analyzing-official-content.md) |
99
108
  | Comment thread deep dive | [`community-analyzing-theme-comment.md`](references/community-analyzing-theme-comment.md) |
109
+ | Customer service, after-sales group, or in-game chat | [`community-chat-analysis.md`](references/community-chat-analysis.md) |
110
+ | Report, import, or submit community/WeCom chat data | [`community-data-report.md`](references/community-data-report.md) |
100
111
 
101
112
  ---
102
113
 
@@ -145,6 +156,51 @@ ae-cli community +get_livestream_detail --space-id 1 --game-id 1 --stream-id <id
145
156
  ae-cli community +get_livestream_analysis --space-id 1 --game-id 1 --stream-id <id>
146
157
  ```
147
158
 
159
+ ### 5. Chat analysis
160
+
161
+ Chat capabilities are L3 and must be discovered before use. Read
162
+ [`community-chat-analysis.md`](references/community-chat-analysis.md) for scenario selection,
163
+ call-scoped identity classification, comparison windows, metric definitions, evidence limits, and
164
+ report templates. Never report customer-service performance without a staff identity list.
165
+ The list must be the complete staff roster for the selected service scope, even for a single-agent
166
+ question; a partial roster is discovery context, not permission to calculate KPIs.
167
+
168
+ ```bash
169
+ ae-cli capability search "chat" --domain community
170
+ ae-cli capability inspect community.chat.overview
171
+ ae-cli capability run community.chat.overview \
172
+ --input '{"game_id":3,"start":"<start-yyyy-MM-dd>","end":"<end-yyyy-MM-dd>"}'
173
+ ```
174
+
175
+ ### 6. Data reporting
176
+
177
+ Read [`community-data-report.md`](references/community-data-report.md) before building input. Use an
178
+ explicit ingestion endpoint and verified IDs; do not derive them from the active AE host or analysis
179
+ results.
180
+
181
+ ```bash
182
+ ae-cli --dry-run community data report \
183
+ --endpoint https://<iris-ingress>/sync_content \
184
+ --space-id <space-id> --channel-id <channel-id> --source-id <source-id> \
185
+ --data-type chat --data @chat.json
186
+
187
+ ae-cli community data report \
188
+ --endpoint https://<iris-ingress>/sync_content \
189
+ --space-id <space-id> --channel-id <channel-id> --source-id <source-id> \
190
+ --data-type chat --data @chat.json
191
+ ```
192
+
193
+ ### Data Reporting Workflow
194
+
195
+ 1. Obtain the complete `/sync_content` endpoint from the user or `AE_IRIS_SYNC_ENDPOINT`. Never guess, derive, or concatenate it.
196
+ 2. Verify the real space, channel, and source IDs. Never fabricate identifiers; `--space-id` becomes Iris `game_id`.
197
+ 3. Run `ae-cli community data report --help` before constructing records. Use the installed command's required-field list for each `data_type` as the source of truth, then consult the reporting reference for detailed limits and normalization.
198
+ 4. Prefer `@file` or stdin (`-`) for sensitive records so payloads do not enter shell history.
199
+ 5. Before the first submission of a dataset, run `--dry-run`. Its summary is redacted and does not print business content.
200
+ 6. After the user has clearly requested submission, run the `risk: write` command directly. It does not need `--yes` or another confirmation.
201
+ 7. Interpret success only as `status: "queued"` with `persistence_verified: false`, never as per-record acceptance or durable storage.
202
+ 8. A timeout leaves delivery state unknown. Check the downstream query/storage side before considering another submission, and never retry automatically.
203
+
148
204
  ---
149
205
 
150
206
  ## Dry-run debugging
@@ -175,6 +231,8 @@ ae-cli --dry-run community +search_posts --space-id 1 --game-id 1 \
175
231
  | Daily summary | [`get_daily_summary.md`](references/get_daily_summary.md) |
176
232
  | Risk content | [`get_risk_content.md`](references/get_risk_content.md) |
177
233
  | Live rooms / list / detail / analysis / overview / room metrics | [`get_livestream_rooms.md`](references/get_livestream_rooms.md), [`get_livestream_list.md`](references/get_livestream_list.md), [`get_livestream_detail.md`](references/get_livestream_detail.md), [`get_livestream_analysis.md`](references/get_livestream_analysis.md), [`get_livestream_overview.md`](references/get_livestream_overview.md), [`get_livestream_room_metrics.md`](references/get_livestream_room_metrics.md) |
234
+ | Customer-service, after-sales group, and in-game chat workflows | [`community-chat-analysis.md`](references/community-chat-analysis.md) |
235
+ | Community data reporting, schemas, and queued semantics | [`community-data-report.md`](references/community-data-report.md) |
178
236
 
179
237
  ---
180
238
 
@@ -194,6 +252,12 @@ Commands below are shown **without** the `ae-cli community` prefix; all use the
194
252
 
195
253
  `+get_daily_summary`, `+get_hot_topics`, `+get_topic_detail`
196
254
 
255
+ ### Data reporting (direct ingestion data plane)
256
+
257
+ | Command | Risk | Endpoint | Input |
258
+ |---------|------|----------|-------|
259
+ | `data report` | `write` | `--endpoint` or `AE_IRIS_SYNC_ENDPOINT`; never `--host` | `--data-type` + `--data`, or `--payload` |
260
+
197
261
  ---
198
262
 
199
263
  ## Composite scenario skills
@@ -214,4 +278,4 @@ Structured multi-step reports (MCP tool chains) — open the linked reference fo
214
278
 
215
279
  ## Write operations
216
280
 
217
- Most community commands are **read-only**. If new write-capable commands are added later, confirm user intent and use `--yes` where the CLI marks **`risk: high-risk-write`**.
281
+ Most community commands are **read-only**. `community data report` is an ordinary **`risk: write`** command: explicit user intent is sufficient and no confirmation or `--yes` is required. Only commands marked **`risk: high-risk-write`** use the confirmation gate.
@@ -0,0 +1,341 @@
1
+ # Community chat analysis
2
+
3
+ Use this workflow for customer-service conversations, customer after-sales groups, in-game chat,
4
+ or an unspecified chat dataset. Chat capabilities are dynamic L3 capabilities. Do not invent
5
+ capability IDs, intent codes, server IDs, participant IDs, input fields, or enum values. Participant
6
+ roles are call-scoped inputs; do not assume a persistent customer/staff identity mapping exists.
7
+
8
+ ## Workflow
9
+
10
+ 1. Search the live catalog, inspect every capability that will be called, and use the inspected
11
+ schema as the contract.
12
+ 2. Discover tenant-specific intent definitions with `community.chat.list_intent_rules`.
13
+ 3. Discover servers with `community.chat.list_servers` when the user mentions a server or the
14
+ dataset may be in-game chat.
15
+ 4. If the user did not supply dates, analyze the last seven complete calendar days (ending
16
+ yesterday) and compare with the immediately preceding seven complete days. The concrete dates
17
+ depend on today; compute them from the current date in Asia/Shanghai.
18
+ 5. For "this month vs last month", use month-to-date for the current month (the 1st through today)
19
+ and the full previous calendar month. The windows differ in length, so compare rate metrics
20
+ (`responseRate`, SLA, median, and P90) directly, but normalize volume metrics such as turns and
21
+ messages to per-day values before drawing volume conclusions. Do not compare raw volume totals
22
+ without this normalization, and state both window lengths in the report.
23
+ For service metrics, also record the query as-of time and compare `pendingTurns`: the final date
24
+ may still contain turns whose response window has not matured. If the user requires fully matured
25
+ results, move the end date back until the entire response window has elapsed and use an equal-length
26
+ comparison period. Never treat pending turns as unanswered merely to complete the comparison.
27
+ 6. Prefer the scenario explicitly declared by the user. Otherwise infer it with the rules below
28
+ and label the source as `inferred`. Never hide ambiguity.
29
+ 7. Apply the identity gate before service metrics. Use the scenario-specific flow below; a
30
+ no-roster discovery response is not a service-performance result.
31
+ 8. Run aggregate capabilities for both periods. Drill into no more than the three most important
32
+ anomalies with intent, room, session, or raw-message capabilities.
33
+ 9. Report the period, comparison period, filters, scenario source, identity source, classification
34
+ coverage, evidence, limitations, and recommended actions. Respond in the user's language.
35
+
36
+ Start with:
37
+
38
+ ```bash
39
+ ae-cli capability search "chat" --domain community
40
+ ae-cli capability inspect community.chat.list_intent_rules
41
+ ae-cli capability inspect community.chat.overview
42
+ ```
43
+
44
+ Use `capability dry-run` when composing non-trivial filters, then execute with `capability run`.
45
+ All chat capabilities are read-only; medium risk means the response can contain identities or raw
46
+ conversation evidence, not that the capability mutates data.
47
+
48
+ ## Capability map
49
+
50
+ | Task | Capability |
51
+ |---|---|
52
+ | Tenant intent discovery | `community.chat.list_intent_rules` |
53
+ | Server discovery and scale | `community.chat.list_servers` |
54
+ | Volume, room types, daily trend, intent, sentiment, alerts | `community.chat.overview` |
55
+ | Participant discovery and roster-driven response efficiency | `community.chat.service_metrics` |
56
+ | Rank or filter rooms | `community.chat.search_rooms` |
57
+ | List daily room sessions | `community.chat.list_sessions` |
58
+ | Read a bounded message page | `community.chat.list_messages` |
59
+ | Find individual intent detections | `community.chat.search_intents` |
60
+ | Aggregate intent topics | `community.chat.intent_instances` |
61
+ | Explain one intent topic | `community.chat.intent_detail` |
62
+ | Read evidence attached to one intent | `community.chat.intent_messages` |
63
+ | Find concentrated negative topics | `community.chat.negative_alerts` |
64
+ | Compare daily positive, neutral, and negative intent counts | `community.chat.sentiment_trend` |
65
+
66
+ `room_types` can contain `dm`, `group`, `public`, or `other`. Use `channel_ids` and
67
+ `chat_server_ids` only after discovering or receiving real IDs.
68
+
69
+ ## Scenario selection
70
+
71
+ Prefer the user's declaration. If it is absent, use `overview.roomTypeDistribution` and server
72
+ discovery; participant roles are not available until a scenario-specific identity flow runs:
73
+
74
+ - Infer `customer_service` when DM messages are the clear majority.
75
+ - Infer `after_sales_group` when group messages are the clear majority and the rooms behave like
76
+ support groups rather than public game channels.
77
+ - Infer `in_game_chat` when public/other messages are the clear majority or server dimensions are
78
+ prominent.
79
+ - Use `generic_chat` when signals conflict or no type is a clear majority. State that the scenario
80
+ cannot be inferred reliably and avoid service-performance conclusions.
81
+
82
+ Do not create a service identity roster for an in-game or generic scenario unless the user
83
+ explicitly requests service analysis. Do not call the metric phase without a complete verified or
84
+ inferred staff roster for the selected scope and at least one customer ID or the documented DM
85
+ customer fallback.
86
+
87
+ ## Identity gate
88
+
89
+ **Single-agent questions still require the full staff roster.** In the documented DM fallback where
90
+ `customer_user_ids` is omitted, `service_metrics` classifies every message whose author is not in
91
+ `staff_user_ids` or `excluded_user_ids` as customer traffic. When an explicit customer list is
92
+ supplied, users outside all supplied identity lists remain unclassified and are filtered instead.
93
+ A roster containing only the target agent can therefore misattribute other agents as customers in
94
+ the fallback, or filter their work from an explicit-list analysis; either case invalidates the
95
+ roster-wide result. Always pass the complete staff roster, then read the target agent from its
96
+ `staffMetrics[]` entry -- never from the aggregate `response` block. When the inspected schema
97
+ exposes `focus_staff_user_id`, pass the target ID in that field in addition to the complete roster;
98
+ it is a drill-down selector, not a replacement for the roster.
99
+
100
+ Inspect the live `community.chat.service_metrics` schema before using these fields. The expected
101
+ call-scoped inputs are `staff_user_ids`, `customer_user_ids`, `excluded_user_ids`, and
102
+ `identity_source`; `focus_staff_user_id` is an optional evidence selector when exposed by the live
103
+ schema.
104
+
105
+ Use the same roster for the current and comparison periods. Discover candidates over the union of
106
+ both periods so a user who is inactive in one period is not silently reclassified. If that union
107
+ exceeds the maximum date range in the inspected schema, run discovery separately for each valid
108
+ window, paginate each result, then merge and deduplicate candidates before resolving the roster.
109
+ Never send an over-limit union range. Keep all identity lists disjoint.
110
+
111
+ ### Discovery phase
112
+
113
+ Without staff or customer lists, call `community.chat.service_metrics` over the combined date range
114
+ only when that union fits the maximum range in the inspected live schema. Otherwise, do not attempt
115
+ the over-limit union: call each valid period separately, paginate both, then merge and deduplicate
116
+ their candidates. Reuse the intended room/channel/server filters for every discovery call. Set
117
+ `breakdown_limit` to the largest value allowed by the inspected live schema (currently 100) to
118
+ reduce accidental candidate truncation. Discovery deliberately returns
119
+ `availability:"unavailable"` plus `participantCandidates`. Use candidates only to resolve real
120
+ user IDs and choose bounded evidence.
121
+
122
+ **Detect likely automated / broadcast accounts from `participantCandidates`.** Signals include
123
+ `roomCount` approaching `messageCount`, `messagesPerRoom` approaching 1 (approximately one message
124
+ per room), coverage of hundreds or thousands of rooms, or uniform single-line posts. A high
125
+ `messageCount` or a low `messagesPerRoom` alone is not evidence of automation or staff activity.
126
+ Never place a suspected automated account in `staff_user_ids`; once bounded raw-message evidence
127
+ confirms automation, place it in `excluded_user_ids`.
128
+
129
+ Follow the inspected live schema for candidate pagination. When it exposes `page_num` and
130
+ `page_size`, fetch pages until `participantCandidatesPage.hasMore` is false, merging every page and
131
+ deduplicating by participant ID. Offset pagination is best-effort while late chat data is arriving,
132
+ so keep the filters and date window fixed, fetch pages consecutively, and disclose possible
133
+ duplicates or omissions if the source changes during the scan. If pagination is unavailable,
134
+ `participantCandidatesTruncated` remains true, or a paged result is still incomplete, run discovery
135
+ separately per `room_type`, or per server/channel filter when those dimensions apply, to surface
136
+ more candidates; merge and deduplicate the results. A roster that remains partial is not sufficient
137
+ for service KPIs: ask the user to complete it or use the non-service fallback, and disclose that
138
+ additional low-activity staff may remain uncovered. Do not claim exhaustive identity coverage or
139
+ quote response rates, response times, workload, or any other KPI from a discovery response.
140
+
141
+ If the response has no candidates, or roles cannot be established under the scenario rules below,
142
+ stop the service-metric workflow. Fall back to overview, intent, sentiment, activity, and bounded
143
+ evidence analysis. Explicitly state that service performance is unavailable because no usable
144
+ identity roster was supplied or inferred.
145
+
146
+ ### After-sales group inference
147
+
148
+ For a declared or reliably inferred after-sales group scenario:
149
+
150
+ 1. Start from `participantCandidates`. Prioritize candidates with enough activity to affect the
151
+ result, including accounts active across multiple group rooms.
152
+ 2. Read only a small evidence sample with `list_sessions` and `list_messages`: at most three
153
+ representative group rooms and only enough messages to observe conversational role. Do not
154
+ retrieve a full history merely to classify every participant.
155
+ 3. Infer staff only from conversational behavior supported by evidence, such as repeatedly
156
+ answering customer requests, coordinating follow-up, or serving several support groups. Infer
157
+ customers from supported request or after-sales behavior. Never classify a role solely from a
158
+ display name, message volume, sentiment, response speed, or demographic clues.
159
+ 4. **User-ID format is a structural signal (distinct from a display name).** WeCom external-contact
160
+ IDs (`wmnLKgCwAA…`, `wonLKgCwAA…`, `wrnLKgCwAA…`) are almost always customers; short internal
161
+ handles (pinyin logins, `TD#####`) are staff. Use ID shape to prioritize candidates, then confirm
162
+ staff by conversational behavior in evidence before adding anyone to `staff_user_ids`.
163
+ 5. Leave ambiguous users unclassified. Omit them from both role lists. Put only confirmed bots,
164
+ automated notifications, or system accounts in `excluded_user_ids`.
165
+ 6. Resolve every plausible staff candidate into the complete inferred staff roster for the selected
166
+ scope, and require at least one inferred customer ID. If discovery is incomplete or any plausible
167
+ staff account remains unresolved, ask the user to complete the roster or use the non-service
168
+ fallback; do not calculate service KPIs from a partial inferred roster.
169
+ 7. Call `service_metrics` for each period with the same complete lists and
170
+ `identity_source:"llm_inferred"`.
171
+
172
+ Example input fragment after inference:
173
+
174
+ ```json
175
+ {
176
+ "room_types": ["group"],
177
+ "staff_user_ids": ["staff-user-id"],
178
+ "customer_user_ids": ["customer-user-id"],
179
+ "excluded_user_ids": ["system-user-id"],
180
+ "identity_source": "llm_inferred"
181
+ }
182
+ ```
183
+
184
+ Treat every LLM-inferred result as low confidence, regardless of classification coverage. Coverage
185
+ measures how much message traffic the supplied lists classify; it does not validate that inferred
186
+ roles are correct. Describe staff breakdowns as estimated operational workload, never as personnel
187
+ evaluation. The chat source does not provide staff departments: treat `department:null` as
188
+ unavailable and never infer or report a department. Include the inference basis and the material
189
+ unknown population in the report.
190
+
191
+ ### Customer-service DM declaration
192
+
193
+ For customer-service DMs, do not infer employee identities from message text. Resolve the discovery
194
+ candidates, then require the user to declare the complete staff roster for the selected service
195
+ scope, even when the question targets one agent. Accept IDs directly; if the user supplies names,
196
+ map only unambiguous names to candidate IDs and ask for IDs when names collide.
197
+
198
+ Pass `staff_user_ids` with `identity_source:"user_declared"`. The customer list is optional:
199
+
200
+ - When the user supplies `customer_user_ids`, classify only those explicit customers.
201
+ - When the user omits it, the service treats every participant not in `staff_user_ids` or
202
+ `excluded_user_ids` as a customer. Use this fallback only for DMs and disclose it prominently.
203
+ - Put known bot and system accounts in `excluded_user_ids`; never silently count them as customers.
204
+
205
+ Example input fragment with the DM fallback:
206
+
207
+ ```json
208
+ {
209
+ "room_types": ["dm"],
210
+ "staff_user_ids": ["declared-staff-user-id-1", "declared-staff-user-id-2"],
211
+ "excluded_user_ids": ["known-bot-user-id"],
212
+ "identity_source": "user_declared"
213
+ }
214
+ ```
215
+
216
+ If the user does not provide the complete staff roster after candidate discovery, do not output
217
+ customer-service performance. Continue with non-service chat analysis and state the missing
218
+ prerequisite.
219
+
220
+ ## Customer-service DMs
221
+
222
+ Default to `room_types:["dm"]` unless the user specifies shared service channels.
223
+
224
+ 1. Compare `overview` for current and previous periods.
225
+ 2. Run the DM declaration flow above. Only after the user supplies the complete staff roster, compare
226
+ `service_metrics` for both periods. The default response window is 1440 minutes. Pass
227
+ `sla_minutes` only when the user supplies an SLA.
228
+ 3. Use `search_intents` with `chat_type:"dm"` for room-type-scoped detections and
229
+ `negative_alerts` with `room_types:["dm"]` for escalation. `intent_instances` does not support
230
+ `room_types`; use it only when channel/server scope is sufficient, and disclose the broader
231
+ room-type scope.
232
+ 4. Drill into the largest unanswered, slowest, or most negative rooms and retrieve bounded evidence.
233
+
234
+ Report:
235
+
236
+ - Service health: customer/staff volume, service rooms, response rate, unanswered and pending turns,
237
+ median and P90 response time, and period-over-period movement.
238
+ - Demand map: leading configured intents and emerging topics.
239
+ - Escalations: negative topics and rooms with supporting evidence.
240
+ - Workload: employee response turns, reply messages, rooms, customers, and response time.
241
+ - Actions: staffing, routing, knowledge-base, and follow-up recommendations tied to evidence.
242
+
243
+ Never claim resolution rate, transfer rate, customer satisfaction, or ticket closure. Those fields
244
+ are not present in the chat contract.
245
+
246
+ ## Customer after-sales groups
247
+
248
+ Default to `room_types:["group"]`.
249
+
250
+ 1. Compare group overview across the two periods, then run the bounded group identity inference.
251
+ Compare `service_metrics` only if a complete inferred roster for the selected scope is produced;
252
+ otherwise ask the user to complete it or use the non-service fallback.
253
+ 2. Use room metrics to identify groups with many unanswered turns or slow P90 response.
254
+ 3. Use `search_intents` with `chat_type:"group"` and group-filtered negative alerts to find issues
255
+ recurring across groups. `intent_instances` cannot filter by room type; use it only with a valid
256
+ channel/server scope and disclose that it may include other room types.
257
+ 4. Drill into up to three group/topic combinations for short evidence excerpts.
258
+
259
+ Report:
260
+
261
+ - Group service coverage and response efficiency.
262
+ - A group risk matrix: room, request turns, unanswered/pending turns, response rate, P50/P90, and
263
+ dominant negative or recurring topics.
264
+ - Cross-group issue clusters and the number of affected rooms.
265
+ - Estimated employee workload and suggested owners, labeled low confidence when roles were inferred.
266
+ - Prioritized containment, communication, and product-fix actions.
267
+
268
+ Treat group messages as conversation volume, not ticket volume. Do not infer that an issue is
269
+ resolved merely because an employee replied.
270
+
271
+ ## In-game chat
272
+
273
+ Use all relevant room types; focus on `public`, `group`, and `other` rather than forcing a service
274
+ filter.
275
+
276
+ 1. Compare overview volume, active rooms/users, room-type distribution, and daily trend.
277
+ 2. Run `list_servers` for both periods and union the server IDs, then compare the selected servers
278
+ with server-filtered overview calls using one consistent room-type scope. `list_servers` covers
279
+ all room types and omits messages with an empty server ID, so disclose server-ID message coverage
280
+ against an unfiltered overview before ranking servers.
281
+ 3. Analyze intent topics, sentiment trend, concentrated negative alerts, and high-activity rooms.
282
+ 4. Drill into up to three emerging or high-risk topics for evidence.
283
+
284
+ `intent_instances` supports server IDs but not room types; `search_intents` supports one chat type
285
+ but not server IDs. Do not claim a server-by-room-type intent comparison that the live contract
286
+ cannot express. Choose one verified dimension and disclose the limitation.
287
+
288
+ Report:
289
+
290
+ - Ecosystem health and period-over-period activity.
291
+ - Server/channel differences without ranking servers that lack comparable data.
292
+ - Emerging topics, intent changes, and negative concentration.
293
+ - High-risk rooms and short evidence excerpts.
294
+ - Community-operation, moderation, incident-response, or game-product actions.
295
+
296
+ Do not present customer-service KPIs when identity mapping is unavailable or irrelevant.
297
+
298
+ ## Service metric semantics
299
+
300
+ - The response envelope has two levels. The top-level `response` and `volume` blocks are
301
+ **roster-wide aggregates** and are only valid when the roster is complete. `staffMetrics[]` is
302
+ **per-agent**. Answer single-agent questions from the matching `staffMetrics[]` entry, not the
303
+ aggregate block.
304
+ - `staffMetrics[]` exposes per-agent workload and responded-turn timing, such as reply messages,
305
+ responded turns, service rooms/customers, and average/P50/P90 response time. It does not expose
306
+ a per-agent request-turn denominator, unanswered turns, `responseRate`, or `slaMetRate`. Never
307
+ attribute roster-wide response/SLA rates or an unanswered turn to one employee, and do not derive
308
+ a personal rate from fields that lack a valid denominator.
309
+ - When `focus_staff_user_id` is available, keep the complete `staff_user_ids` roster and use
310
+ `focusedStaffTurns` for bounded evidence drill-down into that employee's slowest responded turns.
311
+ A turn belongs to the focused employee only when that employee owns the first staff response.
312
+ Never attribute an unanswered turn to an individual employee. Use the returned room, timestamps,
313
+ and trigger/response message IDs to fetch only the evidence needed for the finding. When
314
+ `focusedStaffTurnsTruncated` is true, disclose that only the slowest `breakdown_limit` turns were
315
+ returned; do not present the bounded list as the employee's complete turn history.
316
+ - A request turn starts with a customer message. Consecutive customer messages remain one turn
317
+ until the first employee response or an inactivity gap longer than `response_window_minutes`.
318
+ - The response deadline and response duration are measured from the turn's first customer message;
319
+ customer follow-ups inside the same turn do not restart that clock.
320
+ - The first employee response closes and owns the turn. Later employee messages do not create
321
+ additional responded turns.
322
+ - A response after the analysis end still counts when it falls inside the response window.
323
+ - A turn with no response is `pending` until its full response window has elapsed. Pending turns are
324
+ excluded from the response-rate denominator. SLA uses its own observation threshold: a turn enters
325
+ the SLA denominator once it has a response or has waited at least `sla_minutes`, even when it is
326
+ still pending under a longer response window. For example, with a 24-hour response window and a
327
+ 30-minute SLA, an unanswered turn waiting one hour is pending but already SLA-eligible and missed.
328
+ - Average, median, and P90 response time use responded turns only.
329
+ - `identity_source:"llm_inferred"` is always low confidence. Never upgrade it based on coverage.
330
+ - A no-roster response is candidate discovery only. When metrics are unavailable, fall back to
331
+ volume, intent, sentiment, and evidence analysis and state the reason.
332
+ - Classification coverage describes messages assigned by the supplied call-scoped roster. It is
333
+ not evidence that the role assignments are correct.
334
+
335
+ ## Evidence and privacy
336
+
337
+ - Use aggregate results first. Fetch raw messages only for a selected anomaly or explicit request.
338
+ - Do not paste full message pages. Quote the minimum excerpt that supports a finding.
339
+ - Mask or omit user IDs, phone numbers, order numbers, and other unnecessary identifiers.
340
+ - Separate measured facts from scenario inference and recommendations.
341
+ - If live data does not cover a scenario, say so; do not present fixture or inferred evidence as live.