@thinkingai/ae-cli 6.1.7 → 6.1.9

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 (80) hide show
  1. package/README.md +219 -150
  2. package/README.zh.md +227 -159
  3. package/dist/{auth-UPGUOKTW.js → auth-56Z45UVR.js} +1 -1
  4. package/dist/{capability-TQ5KU5Q6.js → capability-2H6PAOA3.js} +1 -1
  5. package/dist/{capability-AJC5CBRT.js → capability-YPOQX6PL.js} +1 -1
  6. package/dist/{chunk-4Q5TNP4Q.js → chunk-J7MZHDHQ.js} +48 -24
  7. package/dist/chunk-KTYR3U6D.js +1012 -0
  8. package/dist/{chunk-6CHYBI64.js → chunk-LHVM35J4.js} +1 -1
  9. package/dist/{chunk-ISY6HMHM.js → chunk-PVBYJWC2.js} +1 -1
  10. package/dist/{config-PMPISN5Y.js → config-BSSALXEN.js} +1 -1
  11. package/dist/index.js +79 -22
  12. package/dist/{metadata-P5GIVMZ6.js → metadata-AN3YFZEV.js} +2 -2
  13. package/dist/{metadata-ELUAR3EJ.js → metadata-JIQ77HFY.js} +2 -2
  14. package/dist/{model-OYQLXCQY.js → model-JASQVOFD.js} +1 -1
  15. package/dist/{raw-TPB7KSZO.js → raw-XJCAT3HX.js} +1 -1
  16. package/dist/{sync-EFJKFZK2.js → sync-QFP4XFN3.js} +2 -2
  17. package/dist/{te-agent-BOQ7ZY56.js → te-agent-JHUG6DVV.js} +28 -1
  18. package/dist/{te-analysis-HZIP6SYW.js → te-analysis-IWQZO423.js} +213 -129
  19. package/dist/{te-analysis-ZT2MYAHL.js → te-analysis-X222IRYR.js} +213 -129
  20. package/dist/{te-dataops-VYN3IOKO.js → te-dataops-PZQ5NQLY.js} +1 -1
  21. package/dist/{te-dataops-Y5QAPPPF.js → te-dataops-XTWVTJCA.js} +1 -1
  22. package/dist/{te-engage-2FSDUOIZ.js → te-engage-E7F4HTXU.js} +87 -4
  23. package/dist/{te-engage-BMJ6UOUU.js → te-engage-NLZUPSBK.js} +87 -4
  24. package/dist/{te-experiment-KYRWAUZY.js → te-experiment-D32TB6ZB.js} +2 -2
  25. package/dist/{te-experiment-4JC7WUKW.js → te-experiment-N63WF7XA.js} +2 -2
  26. package/dist/te-system-AH7DMCAQ.js +1706 -0
  27. package/dist/{te-team-PDKKW7Q5.js → te-team-BQ3SKSZV.js} +1 -1
  28. package/dist/update-DKG6UXEM.js +123 -0
  29. package/package.json +8 -3
  30. package/skills/ae-agent/SKILL.md +2 -2
  31. package/skills/ae-agent/references/create-automation.md +12 -0
  32. package/skills/ae-agent/references/update-automation.md +11 -3
  33. package/skills/ae-analysis/SKILL.md +1 -1
  34. package/skills/ae-analysis/references/alert_create.md +2 -3
  35. package/skills/ae-analysis/references/alert_update.md +2 -3
  36. package/skills/ae-analysis/references/analysis_gateway_assets.md +6 -4
  37. package/skills/ae-analysis/references/bi_panel_create.md +12 -4
  38. package/skills/ae-analysis/references/bi_panel_update.md +11 -8
  39. package/skills/ae-analysis/references/bi_panel_version_publish.md +3 -1
  40. package/skills/ae-analysis/references/command_index.md +10 -7
  41. package/skills/ae-analysis/references/dashboard_daily_report_get.md +18 -0
  42. package/skills/ae-analysis/references/dashboard_daily_report_send.md +12 -9
  43. package/skills/ae-analysis/references/dashboard_daily_report_send_status.md +22 -0
  44. package/skills/ae-analysis/references/dashboard_daily_report_update.md +13 -6
  45. package/skills/ae-analysis/references/drilldown_user_events_export.md +5 -0
  46. package/skills/ae-analysis/references/drilldown_user_events_run.md +6 -0
  47. package/skills/ae-analysis/references/super_metadata_batch_create.md +29 -0
  48. package/skills/ae-analysis/references/super_metadata_batch_edit.md +24 -0
  49. package/skills/ae-engage/SKILL.md +32 -5
  50. package/skills/ae-engage/references/activity-topic.md +34 -1
  51. package/skills/ae-engage/references/add-channel.md +2 -3
  52. package/skills/ae-engage/references/build-task-save-guide.md +17 -3
  53. package/skills/ae-engage/references/channel-detail.md +2 -3
  54. package/skills/ae-engage/references/channel-list.md +2 -5
  55. package/skills/ae-engage/references/channel-mgmt.md +17 -2
  56. package/skills/ae-engage/references/channel-test-send.md +1 -1
  57. package/skills/ae-engage/references/channel-update-config.md +1 -1
  58. package/skills/ae-engage/references/delete-channel.md +2 -3
  59. package/skills/ae-engage/references/save-flow.md +6 -3
  60. package/skills/ae-engage/references/save-task.md +12 -15
  61. package/skills/ae-engage/references/scene-config-channel.md +28 -4
  62. package/skills/ae-engage/references/scene-config-group.md +1 -1
  63. package/skills/ae-engage/references/scene-config-item.md +1 -1
  64. package/skills/ae-engage/references/scene-config-metric.md +1 -1
  65. package/skills/ae-engage/references/scene-config-param.md +1 -1
  66. package/skills/ae-engage/references/scene-preset-metric.md +1 -1
  67. package/skills/ae-engage/references/scene-strategy-audience.md +680 -0
  68. package/skills/ae-engage/references/scene-strategy.md +16 -1
  69. package/skills/ae-engage/references/scene-template.md +1 -1
  70. package/skills/ae-engage/references/update-channel-status.md +2 -3
  71. package/skills/ae-generate-tracking-code/SKILL.md +5 -5
  72. package/skills/ae-generate-tracking-code/references/autotrack-enum.md +4 -4
  73. package/skills/ae-generate-tracking-code/references/client-sdk-insert.md +1 -1
  74. package/skills/ae-generate-tracking-code/references/debug-script.md +2 -2
  75. package/skills/ae-generate-tracking-code/references/logbus-config.md +1 -1
  76. package/skills/ae-generate-tracking-code/references/restful-call.md +1 -1
  77. package/skills/ae-generate-tracking-code/references/sdk-index.md +36 -36
  78. package/skills/ae-system/SKILL.md +357 -0
  79. package/dist/chunk-IMMGMU54.js +0 -674
  80. package/skills/ae-analysis/references/alert_definition_schema_get.md +0 -24
@@ -0,0 +1,22 @@
1
+ # analysis dashboard-daily-report send-status
2
+
3
+ Use after `dashboard-daily-report send` to inspect the actual delivery result.
4
+ Do not use it to read or change the saved daily report configuration.
5
+
6
+ Command:
7
+
8
+ ```bash
9
+ ae-cli analysis dashboard-daily-report send-status --project-id <project_id> --task-id <task_id>
10
+ ```
11
+
12
+ The normalized `status` is one of:
13
+
14
+ - `queued`
15
+ - `rendering`
16
+ - `sending`
17
+ - `succeeded`
18
+ - `partially_succeeded`
19
+ - `failed`
20
+ - `canceled`
21
+
22
+ Output also includes `progress`, `message`, and per-channel status when the backend task contains channel details.
@@ -1,19 +1,26 @@
1
1
  # analysis dashboard-daily-report update
2
2
 
3
- Use when the user wants to update a dashboard daily report configuration.
3
+ Use when the user wants to create or update a dashboard daily report configuration.
4
4
 
5
5
  Do not use to send immediately. Use `dashboard-daily-report send`.
6
6
 
7
7
  Command:
8
8
 
9
9
  ```bash
10
- ae-cli analysis dashboard-daily-report update --project-id <project_id> --dashboard-id <dashboard_id> [--enable-send true] [--send-time <time>] [--send-title <title>] [--send-content <content>] [--payload '{...}']
10
+ ae-cli analysis dashboard-daily-report update --project-id <project_id> --dashboard-id <dashboard_id> [--enable-send true] [--send-time <time>] [--enable-email true] [--email-new <emails>] [--payload '{...}']
11
11
  ```
12
12
 
13
- Input sends `project_id`, `dashboard_id`, and optional daily report fields or `payload`.
13
+ The command is a patch-style upsert:
14
14
 
15
- When `--payload` is absent, the command sends safe defaults expected by the gateway: `need_csv=false`, empty `host_url`, all channel switches false, `send_date=1,2,3,4,5,6,7`, `send_time=09:00`, `lang=zh-CN`, `screen_type=normal`, `zone_offset=0`, and `enable_send=false`. When `--payload` is present, payload values remain authoritative; pass top-level flags only for fields you intentionally want to override.
15
+ - If the dashboard has no saved configuration, the backend creates one and applies defaults for omitted fields.
16
+ - If a configuration exists, omitted fields remain unchanged.
17
+ - Pass an explicit boolean to enable or disable a saved channel.
18
+ - Pass an empty string or array to clear a saved destination.
16
19
 
17
- When enabling Feishu, pass `--enable-feishu true --feishu-info '{"app_id":"cli_xxx","app_secret":"secret_xxx","webhook":["https://open.feishu.cn/open-apis/bot/v2/hook/..."]}'`. All three fields are required because the backend uploads the dashboard image before calling the group-bot webhook. Treat `app_secret` as sensitive input.
20
+ SMTP transport is not caller-selectable. For direct email addresses, the backend uses company SMTP when configured and otherwise uses the default mail service.
18
21
 
19
- Output is the gateway envelope. `data` contains the daily report configuration update result.
22
+ When enabling Feishu, pass `--enable-feishu true --feishu-info '{"app_id":"cli_xxx","app_secret":"secret_xxx","webhook":["https://open.feishu.cn/open-apis/bot/v2/hook/..."]}'`. Treat `app_secret` and webhook URLs as sensitive.
23
+
24
+ Use `dashboard-daily-report get` before a selective update when the current state matters. The get response redacts secrets and webhook URLs, so do not copy the full response back as an update payload.
25
+
26
+ Output is the gateway envelope. `data` contains the saved daily report configuration result.
@@ -21,6 +21,11 @@ The nested backend keys are exactly `columnName` and `tableType`, and the table
21
21
 
22
22
  Use the exact `drilldown_context_id` and canonical `user_id` returned by a user-subject `analysis drilldown-entities run`. Do not use a custom entity, an entity export artifact, or a guessed identity. Export does not accept `--limit`, `--offset`, `--page-num`, or `--page-size`; Common builds the same authorized event-sequence query without the synchronous 1000-row preview cap and streams one `csv.gz` artifact. The platform full-download ceiling (`model_full_download_limit`) still applies.
23
23
 
24
+ For a `scope=total` source coordinate, there is no single selected date. Common
25
+ preserves the machine date coordinates returned by the source query together
26
+ with that query's time granularity, such as daily, weekly, or monthly. Do not
27
+ construct dates outside that context or force a daily granularity.
28
+
24
29
  Inspect the returned `run_id` with `analysis run inspect`, then download the completed artifact with `analysis artifact download`.
25
30
 
26
31
  Output is an async run/artifact descriptor. The complete event rows exist only in the downloaded artifact; they cannot be used as new analysis coordinates.
@@ -29,6 +29,12 @@ ae-cli analysis drilldown-user-events run \
29
29
 
30
30
  Do not use raw QP, `query_context_id`, or guessed user IDs for this command.
31
31
 
32
+ For a `scope=total` source coordinate, there is no single selected date. Common
33
+ preserves the machine date coordinates returned by the source query together
34
+ with that query's time granularity, such as daily, weekly, or monthly. Do not
35
+ invent `target_dates`, force a daily granularity, or replace the returned
36
+ `drilldown_context_id`.
37
+
32
38
  Do not call this command merely because an entity row looks like a user. The explicit subject and follow-up context are the authority.
33
39
 
34
40
  ## Output
@@ -0,0 +1,29 @@
1
+ # analysis-meta super-metadata batch-create
2
+
3
+ Use this command to create effective system metadata in batch through the capability gateway: super events, event properties, and user properties.
4
+
5
+ Do not use it for ordinary event/property CRUD, metadata import from XLSX, or asset governance. Use the dedicated event/property commands, event-property-bundle import, or governance commands instead.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli analysis-meta super-metadata batch-create --project-id <project_id> --events '[{"event_name":"purchase","event_desc":"Purchase"}]' --event-properties '[{"prop_name":"amount","select_type":"number","super_event_names":["purchase"]}]' --dry-run
11
+ ```
12
+
13
+ Capability id: `metadata.super_metadata.batch_create`.
14
+
15
+ Input sends `project_id` plus any non-empty JSON arrays among `events`, `event_properties`, and `user_properties`. Use snake_case object fields exactly as documented by the common-service schema:
16
+
17
+ - Event items: `event_name`, optional `event_desc`, optional `remark`, optional `super_event_prop_names`.
18
+ - Event property items: `prop_name`, `select_type`, optional `prop_desc`, optional `prop_remark`, optional `common_prop`, optional `super_event_names`.
19
+ - User property items: `prop_name`, `select_type`, optional `prop_desc`, optional `prop_remark`.
20
+
21
+ Output returns `created.events`, `created.event_properties`, and `created.user_properties` with created names and IDs, plus count metadata. If common-service rejects a duplicate, bad reference, or invalid type, preserve the gateway error code and message.
22
+
23
+ ## Parameters
24
+ | Parameter | Required | Description |
25
+ |---|---|---|
26
+ | `--project-id` | Yes | Numeric project ID. |
27
+ | `--events` | No | Super event JSON array. |
28
+ | `--event-properties` | No | Event property JSON array. |
29
+ | `--user-properties` | No | User property JSON array. |
@@ -0,0 +1,24 @@
1
+ # analysis-meta super-metadata batch-edit
2
+
3
+ Use this command to batch edit descriptions and remarks for effective system metadata through the capability gateway.
4
+
5
+ Do not use it to create metadata, delete metadata, hide metadata, update event/property relations, or edit governance assets. Use batch-create or the dedicated metadata commands instead.
6
+
7
+ Command:
8
+
9
+ ```bash
10
+ ae-cli analysis-meta super-metadata batch-edit --project-id <project_id> --type event_property --items '[{"prop_name":"amount","prop_desc":"Amount","prop_remark":"Revenue amount"}]' --dry-run
11
+ ```
12
+
13
+ Capability id: `metadata.super_metadata.batch_edit`.
14
+
15
+ Input sends `project_id`, `type`, and `items`. For `type=event`, each item identifies the target with `event_name` and may set `event_desc` or `remark`. For `type=event_property` or `type=user_property`, each item identifies the target with `prop_name` and may set `prop_desc` or `prop_remark`.
16
+
17
+ Output returns `type` and `updated_count`. Preserve validation errors from common-service, especially missing names, unsupported `type`, or empty `items`.
18
+
19
+ ## Parameters
20
+ | Parameter | Required | Description |
21
+ |---|---|---|
22
+ | `--project-id` | Yes | Numeric project ID. |
23
+ | `--type` | Yes | Metadata type to edit: `event`, `event_property`, or `user_property`. |
24
+ | `--items` | Yes | Batch edit item JSON array. |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ae-engage
3
3
  version: 1.0.0
4
- description: "AE Engage MCP: config items, flows, channel settings, task data query, and management"
4
+ description: "AE Engage capability gateway: config center, flows, push/config channels, strategies, templates, and task management. Trigger words: config center, scene config, push channel, config channel, operation strategy, operation task, template, config item, Engage, Hermes, engage-scene, engage-setting, engage-flow, engage-task."
5
5
  ---
6
6
 
7
7
  # ae-engage
@@ -43,6 +43,27 @@ Typical use cases include:
43
43
  - Querying config items and strategies, copying templates, and managing strategy status
44
44
  - Querying flow lists, node schemas, and flow reports, and saving or managing flows
45
45
 
46
+ ## Keyword Routing
47
+
48
+ When the user mentions a product term below (including common Chinese UI labels), open the listed reference(s) first — do not guess commands or IDs.
49
+
50
+ | Keyword | Product meaning | CLI domain | Primary reference | Related references |
51
+ |---|---|---|---|---|
52
+ | **Config center** | Engage scene management / config center overview | `engage-scene` | `references/scene-config-item.md` | `scene-config-param.md`, `scene-config-group.md`, `scene-preset-metric.md`, `scene-config-metric.md`, `scene-config-channel.md`, `channel-mgmt.md`, `scene-strategy.md`, `scene-template.md`; L3 reports: `config-item-trigger-report.md`, `config-item-analysis-report.md`, `config-item-strategy-comparison.md` |
53
+ | **Scene config** | Same as config center; params, groups, metrics, channels, strategies, and templates under a config item | `engage-scene` | `references/scene-config-item.md` | Same as above; params/groups/metrics: `scene-config-param.md`, `scene-config-group.md`, `scene-preset-metric.md`, `scene-config-metric.md` |
54
+ | **Config item** | A single config item in the config center | `engage-scene` | `references/scene-config-item.md` | `scene-config-param.md`, `scene-preset-metric.md`, `scene-config-metric.md`, `scene-strategy.md`, `scene-template.md` |
55
+ | **Push channel** | Project-level message push channels (Webhook, FCM, APNS, etc.) | `engage-setting` | `references/channel-list.md` | `channel-detail.md`, `add-channel.md`, `update-channel-status.md`, `delete-channel.md`, `channel-update-config.md`, `channel-test-send.md`, `channel_touch_limits_list.md` |
56
+ | **Config channel** | Config-center Webhook/client config channels (not the same as push channels) | `engage-scene` | `references/scene-config-channel.md` | `channel-mgmt.md` (create/enable-disable/copy/delete workflows). User params in `config.customsParamList` require `columnName` with `user:` prefix (e.g. `user:#account_id`); preflight names with ae-analysis `analysis-meta property list/get`. |
57
+ | **Operation strategy** | Ops/delivery strategies under a config item | `engage-scene` | `references/scene-strategy.md` | Custom audience QP: [`scene-strategy-audience.md`](references/scene-strategy-audience.md) — **用户满足** `filts[0]` + **用户行为** `filts[1]` two-block mix QP; preflight props (stop + list if missing); examples A/B/C; template: `scene-template.md` |
58
+ | **Operation task** | Hermes push/engagement tasks (list, save, lifecycle, reports) | `engage-task` | `references/task-list.md` | `task-detail.md` (get), `save-task.md`, `build-task-save-guide.md`, `task-stats.md`, `task-delete.md`, `push-record-query.md`, `task-data-overview.md`, `task-data-detail.md`, `task-metric-detail.md`, `task-experiment-report.md` |
59
+ | **Template** | Strategy templates under a config item | `engage-scene` | `references/scene-template.md` | `scene-config-param.md` (template fields reference `paramId`); enable via `template update` then `template update-status` before strategy create |
60
+
61
+ **Easy to confuse:**
62
+
63
+ - **Push channel** → `ae-cli engage-setting channel …` (Hermes push channel settings)
64
+ - **Config channel** → `ae-cli engage-scene config-channel …` (config-center channels; see `channel-mgmt.md`)
65
+ - Flow / Task canvas nodes use `channelId` from **push channels**; config items bind `channel_id` from **config channels**
66
+
46
67
  ## Parameter Conventions
47
68
 
48
69
  - Use regular flags for simple parameters, for example `--project-id`, `--task-id`, and `--flow-uuid`
@@ -230,6 +251,8 @@ ae-cli engage-scene config-metric update-rule --project-id <project_id> --metric
230
251
  ae-cli engage-scene config-metric batch-delete --project-id <project_id> --config-id <config_id> --metric-ids '[1,2]' --yes
231
252
 
232
253
  # Config channel list / get / create / update / update-status / delete / query-log
254
+ # User params: verify each customsParamList columnName via ae-analysis property list/get first; then use user:<prop_name>
255
+ # Strategy custom audience: scene-strategy-audience.md — mix QP filts[0]=用户满足, filts[1]=用户行为; strategy predict for 预估人数
233
256
  # Workflows: references/channel-mgmt.md · schema: references/scene-config-channel.md
234
257
  ae-cli engage-scene config-channel list --project-id <project_id> [--channel-type 0|1]
235
258
  ae-cli engage-scene config-channel get --project-id <project_id> --channel-id <channel_id>
@@ -243,6 +266,7 @@ ae-cli engage-scene config-channel query-log --project-id <project_id> --channel
243
266
  ae-cli engage-scene strategy create --project-id <project_id> --payload '{"configId":"cfg-1","templateId":"tpl-1","strategyName":"s1"}'
244
267
  ae-cli engage-scene strategy update --project-id <project_id> --payload '{"strategyUuid":"uuid-1"}'
245
268
  ae-cli engage-scene strategy log --project-id <project_id> --strategy-uuid <uuid>
269
+ ae-cli engage-scene strategy predict --project-id <project_id> --qp '<mix QP string>' --zone-offset 8 [--strategy-uuid <uuid>]
246
270
  ae-cli engage-scene strategy batch-copy --project-id <project_id> --config-id <config_id> --strategy-ids '["s1"]'
247
271
 
248
272
  # Template list / get / create / update / update-status / delete
@@ -412,7 +436,8 @@ More detailed single-command guidance is available in the business-oriented `ref
412
436
  - `references/scene-config-metric.md` (`engage-scene.config-metric.{list,get,batch-add,update-rule,batch-delete}`)
413
437
  - `references/scene-config-channel.md` (`engage-scene.config-channel.{list,get,create,update,update-status,delete,query-log}`)
414
438
  - `references/channel-mgmt.md` (config channel management workflows)
415
- - `references/scene-strategy.md` (`engage-scene.strategy.{list,get,create,update,log,batch-copy,manage}`)
439
+ - `references/scene-strategy.md` (`engage-scene.strategy.{list,get,create,update,log,predict,batch-copy,manage}`)
440
+ - `references/scene-strategy-audience.md` (custom audience mix QP: 用户满足/用户行为 two-block layout, preflight, worked examples A/B/C)
416
441
  - `references/scene-template.md` (`engage-scene.template.{list,get,copy,create,update,update-status,delete}`)
417
442
  - `references/config-item-trigger-report.md` (`engage-scene.report.config-item-trigger`, L3)
418
443
  - `references/config-item-analysis-report.md` (`engage-scene.report.config-item-analysis`, L3)
@@ -486,11 +511,13 @@ For task draft creation or update, use this workflow:
486
511
 
487
512
  1. `ae-cli engage-setting channel list --project-id <projectId>`
488
513
  2. `ae-cli engage-task task build-save-guide --project-id <projectId> --req '{...}'`
489
- 3. If the guide says QP-derived fields are needed, create the audience with `analysis user-cluster create`, then read its server-authored definition with `analysis user-cluster get`
514
+ 3. If the guide says QP-derived fields are needed (`targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, or `completionIndicatorDef.event`), call:
515
+ `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>`
516
+ Use the returned skill text to build those fields. For existing-cluster audiences (`targetClusterType=2`), use `analysis user-cluster get` instead of hand-writing QP.
490
517
  4. `ae-cli engage-task task save --project-id <projectId> --req '{...}'`
491
518
 
492
519
  `engage-task task build-save-guide` is a read-only helper. It returns scenario-specific required fields, channel content schema, unsupported combinations, examples, and a handoff template for `save_task`.
493
520
 
494
- `engage-task task save` only saves a draft. It does not submit approval, does not start sending, and does not trigger task execution. If `req.taskId` is omitted it creates a new draft; if `req.taskId` is present it updates an existing draft. Update mode only supports draft tasks, and omitted fields can inherit from the existing draft before validation.
521
+ `engage-task task save` creates or updates a task configuration. It does not submit approval, does not start sending, and does not trigger task execution. If `req.taskId` is omitted it creates a new draft; if `req.taskId` is present it updates an existing **draft or paused** task. Update mode rejects running/ended tasks with `invalid_status`. Omitted fields inherit from the existing task before validation (partial rename/update is supported).
495
522
 
496
- Audience creation is not a fixed preflight step. Use direct `analysis user-cluster create` only when the guide requires a condition audience, and prefer the returned `cluster_name`/`clusterKey`. If the Engage schema explicitly requires QP-derived fields such as `targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, or `completionIndicatorDef.event`, read the saved server-authored definition with `analysis user-cluster get`; never assemble raw QP manually.
523
+ Audience creation is not a fixed preflight step. When the guide requires QP-derived fields (`targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, `completionIndicatorDef.event`), call `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>` first and follow the returned skill definition; do not assemble raw QP manually. For existing-cluster audiences, use `analysis user-cluster get` to copy server-authored definitions when appropriate.
@@ -48,10 +48,14 @@ Topic-level audience uses `topicClusterKey` / `topicQp`; do **not** pass task-le
48
48
 
49
49
  | Value | Required | Notes |
50
50
  |---|---|---|
51
- | `1` (custom) | `topicQp` | Valid condition JSON object string (not `{}`). |
51
+ | `1` (custom) | `topicQp` | Valid condition JSON object string (not `{}`). Use mix QP with `totalCFilter` (and optional `totalOutCFilter`). |
52
52
  | `2` (existed) | `topicClusterKey` | From an existing user cluster. |
53
53
  | `3` (all) | — | **Not supported for activity topics** → `TOPIC_TARGET_CLUSTER_TYPE_UNSUPPORTED`. Use standalone `engage-activity task create` for all-users. |
54
54
 
55
+ **`triggerMixQpVersion`:** For custom audience (`targetClusterType=1`) with mix QP (`totalCFilter` / `totalInCFilter`), set `"4.4"`. UI theme edit parses conditions only when this is `4.4`; missing/blank values make target-user filters render empty. Capability create/update/copy default blank to `"4.4"` (same as UI and standalone task MCP).
56
+
57
+ Task-level extra conditions go in `taskQp` as mix QP under **`totalCFilter` only** (user attrs and/or events). Do not put task-owned conditions in `totalInCFilter` — that key is reserved for topic→task merge (topic `totalCFilter` is copied into task cluster `totalInCFilter` on save).
58
+
55
59
  ### Trigger (`triggerType`)
56
60
 
57
61
  | Value | Required | Notes |
@@ -60,6 +64,35 @@ Topic-level audience uses `topicClusterKey` / `topicQp`; do **not** pass task-le
60
64
  | `1` (schedule repeat) | `startDate`, `endDate`, `triggerCrontab` | |
61
65
  | `2` (manual) | — | **Not supported for activity topics** (UI only offers 0/1). Using it without `endDate` causes `CAPABILITY_EXECUTION_FAILED`. |
62
66
 
67
+ ## Create Topic Orchestration
68
+
69
+ Use this workflow when a topic has a shared audience plus one or more task-level audience splits, message variants, or completion goals.
70
+
71
+ 1. **Separate the intent before building the payload.** Record the parent activity, topic-level shared audience, task-level extra audience for each task, schedule, channel, message content, and completion goal/window as distinct fields. A completion goal is not an audience condition unless the user explicitly says so.
72
+ 2. **Resolve the parent activity.** Use `activity list|get` to verify the exact `activityId`, editable status, activity dates, and timezone. For a repeated topic, keep `startDate` and `endDate` inside the activity period and interpret the cron in the activity timezone.
73
+ 3. **Resolve a real channel.** Query `engage-setting channel list`, then inspect the selected channel before composing content. If several enabled channels match and the user has not specified a provider or an already-confirmed project default, ask which one to use instead of choosing an arbitrary ID.
74
+ 4. **Read the channel content contract.** Call `engage-task task build-save-guide` with the known trigger, audience, channel type, and `channelId`. Build every `groupContentList[].contentList[].content` item from `fieldRules.channelContentSchema`; do not infer App Push keys or parameter types from memory.
75
+ 5. **Prepare audience and completion inputs.** Resolve real event/property metadata and categorical values through the applicable Analysis workflow. Put the shared condition in `topicQp` or `topicClusterKey`, and only task-specific conditions in each `taskQp`. For a rolling condition such as "recent N days" that must be evaluated for future repeated sends, prefer a custom QP; use an existing cluster only after confirming that its refresh semantics match the send cadence. Build the completion goal separately in `completionIndicatorDef`.
76
+ 6. **Build one native `TopicAddDTO`.** Keep nested payload keys in camelCase. Ensure `tasks` is non-empty, `frequencyLimits` and QP fields are JSON strings where documented, each task has channel content, and Android/iOS or other variants map to the correct task audience and message.
77
+ 7. **Validate the complex payload.** Run `topic create ... --validate` while correcting the nested payload. Inspect `normalized_input` and confirm that the schedule, audience boundaries, message variants, and completion window retain the intended semantics. After `valid=true`, execute the same payload directly; do not add a redundant dry-run by default.
78
+ 8. **Create exactly once.** Run `topic create` with the validated payload. A successful response only reports `data.success`; it does not provide enough evidence to declare the whole orchestration complete.
79
+ 9. **Resolve IDs and verify the saved topic.** Call `activity info-list` for the parent activity, match the new topic and tasks by their names, then call `topic get` with the returned `topicId`. Verify the channel, dates, cron, topic audience, each task audience, content, completion goal, and draft status. For custom audiences, confirm that the saved task QP keeps task-owned conditions in `totalCFilter` and the shared topic condition appears only through the topic-to-task merge.
80
+ 10. **Verify generated audiences before reporting completion.** Read the generated topic/task cluster keys with the applicable cluster query and wait for terminal computation state. Require `refresh_status=success`, `progress=100`, `real_available=1`, and `cluster_valid=1`. A zero-user result may be valid, but reconcile it with the discovered categorical values and business expectation. If computation fails, correct only the verified cause and re-check; do not retry an unchanged request or report the topic as fully ready.
81
+
82
+ Recommended command order:
83
+
84
+ ```text
85
+ activity list/get
86
+ -> channel list/get
87
+ -> task build-save-guide
88
+ -> prepare topic audience, task audiences, content, and completion goal
89
+ -> topic create --validate
90
+ -> topic create
91
+ -> activity info-list
92
+ -> topic get
93
+ -> generated audience status checks
94
+ ```
95
+
63
96
  ## Output
64
97
 
65
98
  - `get`: `data.topic` (includes `topicClusterKey` for topic audience).
@@ -1,9 +1,8 @@
1
1
  # ae-engage engage-setting channel create
2
2
 
3
+ > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel create`
3
4
 
4
- Create a new Engage channel.
5
-
6
- Mapped command: `ae-cli engage-setting channel create`
5
+ Create a new Engage push channel.
7
6
 
8
7
  ## Flags
9
8
 
@@ -14,11 +14,25 @@ Use this sequence when creating or updating a task draft:
14
14
 
15
15
  1. Query channels with `ae-cli engage-setting channel list --project-id <projectId>`.
16
16
  2. Call `ae-cli engage-task task build-save-guide --project-id <projectId> --req '{...}'`.
17
- 3. If the guide says an audience or QP-derived fields are required, create the audience directly and read it back:
17
+ 3. If the guide says QP-derived fields are required, fetch the skill definition first:
18
18
 
19
19
  ```bash
20
- ae-cli analysis user-cluster create --project-id <projectId> --cluster-name <condition_cluster_name> --display-name <display_name> --definition-request '<semantic-definition-json>'
21
- ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<condition_cluster_name>"]'
20
+ ae-cli engage-setting query cluster-qp-skill --project-id <projectId>
21
+ # optional selectors:
22
+ ae-cli engage-setting query cluster-qp-skill --project-id <projectId> --response-mode full --condition-subtype all
23
+ ```
24
+
25
+ Use the returned `skill` text to build:
26
+
27
+ - `targetConfig.qp`
28
+ - `triggerConfig.triggerRule` (required for `triggerType=3/4/5`)
29
+ - `clientConfig.clientQp`
30
+ - `completionIndicatorDef.event`
31
+
32
+ For existing-cluster audiences (`targetClusterType=2`), you may copy server-authored definitions via:
33
+
34
+ ```bash
35
+ ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<cluster_name>"]'
22
36
  ```
23
37
 
24
38
  4. Build the final grouped `save_task.req`.
@@ -1,9 +1,8 @@
1
1
  # ae-engage engage-setting channel get
2
2
 
3
+ > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel get`
3
4
 
4
- Query the details of a single Engage channel.
5
-
6
- Mapped command: `ae-cli engage-setting channel get`
5
+ Query the details of a single Engage push channel.
7
6
 
8
7
  ## Response shape
9
8
 
@@ -1,11 +1,8 @@
1
1
  # ae-engage engage-setting channel list
2
2
 
3
+ > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel list`
3
4
 
4
- Query the list of Engage channels in a project.
5
-
6
- Mapped command: `ae-cli engage-setting channel list`
7
-
8
- ## Response shape
5
+ Query the list of Engage push channels in a project.
9
6
 
10
7
  The result is `{ data: { items, total } }`. Channel fields recursively use snake_case, for
11
8
  example `data.items[].channel_id`, `data.items[].channel_status`, and `data.items[].channel_type`.
@@ -1,6 +1,6 @@
1
1
  # Config channel management workflows
2
2
 
3
- > Commands: `ae-cli engage-scene config-channel …` · See [`scene-config-channel.md`](scene-config-channel.md) for flags, `config` JSON shape, and capability ids.
3
+ > Trigger keywords: config center, config channel · Commands: `ae-cli engage-scene config-channel …` · See [`scene-config-channel.md`](scene-config-channel.md) for flags, `config` JSON shape, and capability ids.
4
4
 
5
5
  Use for AE Engage **config center channel management**: Webhook (`channel_type=0`) and client (`channel_type=1`) config channels — list, get, create, update, copy, enable/disable, operation log, and delete.
6
6
 
@@ -12,6 +12,8 @@ Use for AE Engage **config center channel management**: Webhook (`channel_type=0
12
12
  4. `channel_status`: **1 = enabled**, **2 = disabled**.
13
13
  5. Writes require explicit user intent; `delete` is high-risk — confirm, then `--yes`.
14
14
  6. Before changing Webhook URL, auth, or parameter definitions on an enabled channel, disable it first.
15
+ 7. In `config.customsParamList` (**user params**), every `columnName` must be prefixed with `user:` and point to a real user property, e.g. `user:#account_id`. `envParamList` entries do not use this prefix.
16
+ 8. Before create/update, use the **ae-analysis** skill to verify each intended user property exists (`analysis-meta property list --scope user`, then `property get` for exact match). Never invent `columnName` values.
15
17
 
16
18
  ## Permissions
17
19
 
@@ -44,18 +46,31 @@ Parse `data.channel.config` for URL, auth, user params, and env params.
44
46
 
45
47
  Webhook requires `channel_name` and `config.url`. Optional: `testUrl`, auth, user params, env params.
46
48
 
49
+ **Preflight (user params):** for each intended `customsParamList[].columnName`, discover and verify the user property via ae-analysis first:
50
+
51
+ ```bash
52
+ ae-cli analysis-meta property list --project-id <pid> --scope user --query <keyword> \
53
+ --fields '["prop_name","prop_desc","select_type"]' --limit 50
54
+ ae-cli analysis-meta property get --project-id <pid> --table-type user --prop-name <prop_name>
55
+ # → use columnName "user:" + prop_name, e.g. user:#account_id
56
+ ```
57
+
58
+ Then create the channel:
59
+
47
60
  ```bash
48
61
  ae-cli engage-scene config-channel create \
49
62
  --project-id <pid> \
50
63
  --channel-name '<name>' \
51
64
  --channel-type 0 \
52
- --config '{"url":"https://...","testUrl":"","authConfig":{"enable":false},"customsParamList":[{"key":"uid","columnName":"#account_id","defaultValue":"","systemIdParam":false}],"envParamList":[]}'
65
+ --config '{"url":"https://...","testUrl":"","authConfig":{"enable":false},"customsParamList":[{"key":"uid","columnName":"user:#account_id","defaultValue":"","systemIdParam":false}],"envParamList":[]}'
53
66
  ```
54
67
 
55
68
  Returns `data.channel_id`. Created channels start **enabled**.
56
69
 
57
70
  ### 4. Update
58
71
 
72
+ Re-verify any new or changed `customsParamList[].columnName` with `analysis-meta property list/get` (ae-analysis skill) before building `--config`.
73
+
59
74
  ```bash
60
75
  ae-cli engage-scene config-channel get --project-id <pid> --channel-id <id>
61
76
  # If channel_status=1 and changing URL / auth / param definitions:
@@ -1,6 +1,6 @@
1
1
  # engage-setting channel test-send
2
2
 
3
- > Capability id: `engage-setting.channel.test-send` · Domain: `engage`.
3
+ > Trigger keywords: push channel · Capability id: `engage-setting.channel.test-send` · Domain: `engage`.
4
4
 
5
5
  ## Command
6
6
 
@@ -1,6 +1,6 @@
1
1
  # engage-setting channel update-config
2
2
 
3
- > Capability id: `engage-setting.channel.update-config` · Domain: `engage`.
3
+ > Trigger keywords: push channel · Capability id: `engage-setting.channel.update-config` · Domain: `engage`.
4
4
 
5
5
  ## Command
6
6
 
@@ -1,9 +1,8 @@
1
1
  # ae-engage engage-setting channel delete
2
2
 
3
+ > Trigger keywords: push channel · Mapped command: `ae-cli engage-setting channel delete`
3
4
 
4
- Delete an Engage channel.
5
-
6
- Mapped command: `ae-cli engage-setting channel delete`
5
+ Delete an Engage push channel.
7
6
 
8
7
  ## Flags
9
8
 
@@ -33,8 +33,8 @@ You still organize user requirements into an intermediate intent first, then map
33
33
  ## 2. Workflow
34
34
 
35
35
  1. Identify the flow intent from the user input and produce a unified intent JSON.
36
- 2. Build a semantic condition request from `ae-analysis/references/user_cluster_models.md`, create the audience directly with `analysis user-cluster create`, and prefer its `cluster_name`/`clusterKey`. Read the saved server-authored definition with `analysis user-cluster get` only when an Engage node schema explicitly requires QP-derived fields; never assemble raw QP.
37
- 3. Run `ae-cli engage-setting channel list --project-id <projectId>` to get the available channels and match real `channel_id` values for touchpoint nodes. For `webhook_push`, also run `ae-cli engage-setting channel get` and use `data.item.config.params_list` to build request field `contentList`.
36
+ 2. Build a semantic condition request from `ae-analysis/references/user_cluster_models.md`, create the audience directly with `analysis user-cluster create`, and prefer its `cluster_name`/`clusterKey`. When node schema requires QP-derived fields (`targetClusterQp`, `triggerRule`, etc.), call `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>` first; never assemble raw QP manually.
37
+ 3. Run `ae-cli engage-setting channel list --project-id <projectId>` to get the available channels and match real `channelId` values for touchpoint nodes. For `webhook_push`, also run `ae-cli engage-setting channel get` and use `data.item.config.params_list` to build request field `contentList` (camelCase; snake_case aliases are normalized during validate).
38
38
  4. Query `ae-cli engage-flow node-config schema --project-id <project_id> --node-type <type>` before constructing each non-trivial node config, then run `ae-cli engage-flow node-config validate --project-id <project_id> --node-type <type> --operation-mode save_flow --config '<config-json-string>'` before placing the config into `nodes` or `nodeConfigs`.
39
39
  5. Map the intent JSON to `nodes` and `edges` (compact form, see §7 / §8).
40
40
  6. `build` → resolve any `need_input` slot → `preview` → `commit`, then verify with `engage-flow flow get`.
@@ -460,7 +460,10 @@ The CLI injects `projectId` into both the top level and `req`; you do not write
460
460
 
461
461
  `need_input` is a **soft prompt**, not a hard error:
462
462
 
463
- - **`data.result.errors` empty + `data.result.next_slot` present** → server needs one more node config (trigger / channel / targetCluster). Answer with request fields `operation=build` + `draftId` + `expectedVersion` + `slotAnswer`. If response `next_slot.target_node_id` is present, request `slotAnswer.nodeConfig` may contain only `config`; otherwise include `nodeId` or `id`.
463
+ - **`data.result.errors` empty + `data.result.next_slot` present** → server needs one more node config (trigger / channel / targetCluster). Answer with request fields `operation=build` + `draftId` + `expectedVersion` + `slotAnswer`. If response `next_slot.target_node_id` is present, request `slotAnswer.nodeConfig` may contain only `config`; otherwise include `nodeId` or `id`. **`slotAnswer.nodeConfig.config` merges into the existing node config** — send only the fields you are adding or changing, not the full config.
464
+ - For existing-cluster entry nodes (`targetUserType=2`), use `targetClusterName` or `clusterId` alias.
465
+ - For custom audiences, call `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>` before filling `targetClusterQp`.
466
+ - For `event_trigger`, `endDate` must be **strictly earlier than** `flowEndDate`.
464
467
  - **`data.result.errors` non-empty** → hard validation failure. Fix `nodes`/`edges` and `build` again (a new `data.result.draft_id` is issued; the stale draft is cleaned by TTL).
465
468
 
466
469
  ### 11.3 Minimal Working Example
@@ -10,13 +10,9 @@ Recommended workflow:
10
10
 
11
11
  1. `ae-cli engage-setting channel list --project-id <projectId>`
12
12
  2. `ae-cli engage-task task build-save-guide --project-id <projectId> --req '{...}'`
13
- 3. If the guide indicates an audience or QP-derived fields are needed, create the audience directly and read it back:
14
-
15
- ```bash
16
- ae-cli analysis user-cluster create --project-id <projectId> --cluster-name <condition_cluster_name> --display-name <display_name> --definition-request '<semantic-definition-json>'
17
- ae-cli analysis user-cluster get --project-id <projectId> --cluster-names '["<condition_cluster_name>"]'
18
- ```
19
-
13
+ 3. If the guide indicates QP-derived fields, call `ae-cli engage-setting query cluster-qp-skill --project-id <projectId>` and build
14
+ `targetConfig.qp`, `triggerConfig.triggerRule`, `clientConfig.clientQp`, or `completionIndicatorDef.event`
15
+ from the returned skill text. For existing-cluster audiences, use `analysis user-cluster get`.
20
16
  4. Build the final grouped `req`
21
17
  5. `ae-cli engage-task task save --project-id <projectId> --req '{...}'`
22
18
 
@@ -40,7 +36,7 @@ For the full guide contract, request format, return sections, and handoff usage,
40
36
  The command supports two modes:
41
37
 
42
38
  - create mode: omit `req.taskId`
43
- - update mode: include `req.taskId` for an existing draft task
39
+ - update mode: include `req.taskId` for an existing draft or paused task
44
40
 
45
41
  Regardless of mode, this tool only saves a draft:
46
42
 
@@ -59,8 +55,8 @@ Notes:
59
55
  - the outer Capability input uses `project_id` and `req`; fields inside `req` keep the native camelCase DTO shape shown below
60
56
  - Hermes assigns the outer `--project-id` to `req.projectId`; if `req.projectId` is also present, the outer value wins
61
57
  - the whole `req` must be a JSON object, not a stringified JSON string
62
- - for update mode, Hermes only allows modifying draft tasks
63
- - in update mode, omitted fields are backfilled from the existing draft before validation, so partial draft updates are allowed
58
+ - for update mode, Hermes allows modifying **draft** or **paused** tasks (`status` 0 or 2); running/ended tasks are rejected with `invalid_status`
59
+ - in update mode, omitted fields are backfilled from the existing task before validation, so partial updates (e.g. rename only) are allowed
64
60
 
65
61
  ### Response shape
66
62
 
@@ -160,12 +156,13 @@ Top-level notes:
160
156
 
161
157
  ### 4.1 `taskId`
162
158
 
163
- Use `taskId` only when you are updating an existing draft task.
159
+ Use `taskId` only when you are updating an existing draft or paused task.
164
160
 
165
161
  - create mode: omit `taskId`
166
162
  - update mode: include `taskId`
167
- - update mode can send only the fields that need changing
168
- - update mode still fails if the referenced task is not in draft status
163
+ - update mode can send only the fields that need changing (e.g. `baseInfo.taskName` for rename)
164
+ - update mode fails with `invalid_status` if the task is running or ended
165
+ - for paused tasks that already started pushing, Hermes rejects changes to key attributes (channel, trigger time/type, audience cluster, timezone, completion indicators); renames and other non-key fields remain allowed
169
166
 
170
167
  ### 4.2 `channelConfig`
171
168
 
@@ -273,7 +270,7 @@ Before submission, verify:
273
270
  5. `targetClusterType` matches the presence or absence of `clusterKey` / `qp`.
274
271
  6. `triggerType` matches the provided scheduling or event fields.
275
272
  7. `completionIndicatorDef` is present and structurally valid for the current scenario.
276
- 8. `taskId` is omitted for create mode and present only for updating a draft.
273
+ 8. `taskId` is omitted for create mode and present only for updating a draft or paused task.
277
274
  9. No unsupported `triggerType=6` is used.
278
275
  10. No placeholder IDs or fabricated resource names remain in the request.
279
276
 
@@ -309,6 +306,6 @@ This command is a write operation.
309
306
  - Do not pass the whole `req` as a JSON string
310
307
  - Do not use `triggerType=6`
311
308
  - Do not invent `channelId`, `clusterKey`, audience definitions, or content keys
312
- - Do not use `taskId` for a non-draft task
309
+ - Do not use `taskId` for a running or ended task
313
310
  - Do not pass `occasionKeys`; Hermes derives them from content
314
311
  - Do not call the semantic cluster definition builder as a reflex; call it only when guide output says QP-derived fields are needed
@@ -1,6 +1,6 @@
1
1
  # engage-scene config-channel
2
2
 
3
- > Capability ids: `engage-scene.config-channel.{list,get,create,update,update-status,delete,query-log}` · Domain: `engage`.
3
+ > Trigger keywords: config center, scene config, config channel · Capability ids: `engage-scene.config-channel.{list,get,create,update,update-status,delete,query-log}` · Domain: `engage`.
4
4
 
5
5
  Scene / config center — **config channel management** (Webhook / client config channels).
6
6
 
@@ -102,7 +102,7 @@ ae-cli engage-scene config-channel query-log --project-id <project_id> --channel
102
102
  "customsParamList": [
103
103
  {
104
104
  "key": "user_id",
105
- "columnName": "#account_id",
105
+ "columnName": "user:#account_id",
106
106
  "defaultValue": "",
107
107
  "systemIdParam": true
108
108
  }
@@ -114,10 +114,33 @@ ae-cli engage-scene config-channel query-log --project-id <project_id> --channel
114
114
  - `url` — production environment URL (required for webhook)
115
115
  - `testUrl` — optional test environment URL
116
116
  - `authConfig.enable` — channel auth switch; when true, `secretKey` is required; `secretType` **1 = basic**, **2 = advanced**
117
- - `customsParamList` — user params (field key / linked user property / default value / system-integration identity)
118
- - `envParamList` — environment params (from config tables)
117
+ - `customsParamList` — **user params** (field key / linked user property / default value / system-integration identity). Each entry's `columnName` must use the `user:` prefix and reference a real user property code, e.g. `user:#account_id`, `user:#distinct_id`. Do **not** pass bare property names such as `#account_id`.
118
+ - `envParamList` — **environment params** (from config tables). `columnName` here is the env-param field name and does **not** take the `user:` prefix.
119
119
  - At most one `systemIdParam=true` across user + env params
120
120
 
121
+ When creating or updating a config channel (`create` / `update` with `--config`), normalize every `customsParamList[].columnName` to `user:<prop_code>` before submit. If `get` returns bare names, add the prefix when building the next update payload.
122
+
123
+ ## Preflight: verify user properties (ae-analysis)
124
+
125
+ Before setting `customsParamList[].columnName`, use the **ae-analysis** skill to confirm each linked user property exists in the project. Do not invent property names.
126
+
127
+ ```bash
128
+ # 1) Browse / search user properties
129
+ ae-cli analysis-meta property list --project-id <project_id> --scope user \
130
+ --query <keyword> \
131
+ --fields '["prop_name","prop_desc","select_type","table_type"]' --limit 50
132
+
133
+ # 2) Verify one exact property before submit (optional but recommended)
134
+ ae-cli analysis-meta property get --project-id <project_id> --table-type user --prop-name <prop_name>
135
+ ```
136
+
137
+ Decision rules:
138
+
139
+ - Read `skills/ae-analysis/references/property_list.md` and `property_get.md` when unsure about flags or output shape.
140
+ - Match a real `data.properties[].prop_name` (or confirmed `data.property.prop_name`) from metadata, then set `columnName` to `user:` + that name — e.g. `prop_name` `#account_id` → `columnName` `user:#account_id`.
141
+ - If the property is not found after list + optional get, stop and tell the user; do not submit the channel config with a fabricated `columnName`.
142
+ - `envParamList` names come from config-table / env-param setup, not from user-property metadata.
143
+
121
144
  ## Output
122
145
 
123
146
  - `list`: `data.items` + `data.total` (snake_case fields: `channel_id` / `channel_name` / `channel_type` / `channel_status` / `creator` / `updater` / `create_time` / `update_time`)
@@ -130,6 +153,7 @@ ae-cli engage-scene config-channel query-log --project-id <project_id> --channel
130
153
 
131
154
  - Risk: `list` / `get` / `query-log` = read; `create` / `update` / `update-status` = write; `delete` = high-risk-write (user confirmation + `--yes`)
132
155
  - Discover `channel_id` with `list` first; never invent IDs
156
+ - **User params (`customsParamList`)**: `columnName` must be `user:<user_prop_code>` (e.g. `user:#account_id`). Applies to both webhook and client channels on create/update. Preflight each name with `ae-cli analysis-meta property list/get` (ae-analysis skill) before submit.
133
157
  - Enabled channel (`channel_status=1`): only limited fields such as name can change; disable first (`update-status --channel-status 2`) before changing URL, auth, or parameter definitions
134
158
  - Delete: disable first, then `delete --yes`
135
159
  - Copy: `get` → rename (often append `_copy`) → `create`
@@ -1,6 +1,6 @@
1
1
  # engage-scene config-group
2
2
 
3
- > Capability ids: `engage-scene.config-group.{list,batch-add,update,batch-delete}` · Domain: `engage`.
3
+ > Trigger keywords: config center, scene config · Capability ids: `engage-scene.config-group.{list,batch-add,update,batch-delete}` · Domain: `engage`.
4
4
 
5
5
  Scene management / config center — config item group management.
6
6
 
@@ -1,6 +1,6 @@
1
1
  # engage-scene config-item
2
2
 
3
- > Capability ids: `engage-scene.config-item.{list,get,create,update,delete}` · Domain: `engage`.
3
+ > Trigger keywords: config center, scene config, config item · Capability ids: `engage-scene.config-item.{list,get,create,update,delete}` · Domain: `engage`.
4
4
 
5
5
  Scene management / config center — config item management.
6
6