@thinkingai/ae-cli 6.0.48-customer.1 → 6.1.0-project-role-upsert.1
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.
- package/README.md +96 -36
- package/README.zh.md +96 -36
- package/dist/{auth-QPEVVBKT.js → auth-FUM37MHF.js} +236 -127
- package/dist/{capability-RUSV77CO.js → capability-AXFQW5WM.js} +49 -33
- package/dist/{chunk-FR2EDAQM.js → chunk-4P355ZWB.js} +69 -1
- package/dist/chunk-6ZIQV5GW.js +26 -0
- package/dist/chunk-ATSM5XAW.js +623 -0
- package/dist/{chunk-6QK7SYYY.js → chunk-BBEFP4SB.js} +29 -37
- package/dist/{chunk-KEWVSO64.js → chunk-CZU3V3DQ.js} +4 -15
- package/dist/chunk-ECBLHAZO.js +15 -0
- package/dist/{chunk-B5HMQAOM.js → chunk-I4WQAEYB.js} +1 -1
- package/dist/{chunk-NSIVXKJH.js → chunk-JDPEVVHR.js} +5 -4
- package/dist/{chunk-BE73PUFX.js → chunk-LNZBEQXW.js} +2 -2
- package/dist/{chunk-GJXRF7Y6.js → chunk-QJQZH5GQ.js} +47 -78
- package/dist/{chunk-BVDST5YT.js → chunk-RSG4ONOI.js} +7 -7
- package/dist/{chunk-JYMGHGCE.js → chunk-VXNMYUXU.js} +24 -13
- package/dist/{chunk-KZ6ZHF5J.js → chunk-WZ6YVQSF.js} +14 -14
- package/dist/{community-report-client-6OL6GBQW.js → community-report-client-XXWGSBSD.js} +2 -4
- package/dist/{config-XNMACCKX.js → config-EXUGQN5T.js} +8 -9
- package/dist/{data-integration-FZQQC3KW.js → data-integration-4NZ53OMT.js} +7 -9
- package/dist/index.js +61 -78
- package/dist/{local-data-upload-client-EFHDLXFG.js → local-data-upload-client-KYOKVYZV.js} +2 -4
- package/dist/{memory-HBJQ2GC5.js → memory-ATNKZNW5.js} +4 -6
- package/dist/{metadata-PGDJE5RQ.js → metadata-SOALPEA7.js} +7 -9
- package/dist/{model-BHLJ2QMT.js → model-E4JMQ4V2.js} +4 -6
- package/dist/{personal-semantic-preference-E5NZ56DN.js → personal-semantic-preference-LOF33N5X.js} +6 -8
- package/dist/project-semantic-RV6NA5LN.js +1113 -0
- package/dist/{sync-MUWPRM5I.js → sync-YV3E66IF.js} +6 -8
- package/dist/{te-agent-WQZTMEK4.js → te-agent-JB5T3PO7.js} +393 -90
- package/dist/{te-analysis-YWCSSLYL.js → te-analysis-TV2YZ4IC.js} +112 -30
- package/dist/{te-community-BNE6KREL.js → te-community-UDBI672N.js} +9 -32
- package/dist/{te-dataops-TXLKM2W6.js → te-dataops-ZLYOCXZ4.js} +19 -20
- package/dist/{te-engage-VEW4CJHK.js → te-engage-EUVMTUDJ.js} +67 -11
- package/dist/te-experiment-ESEYE2SK.js +1059 -0
- package/dist/{te-kb-BUD6N3NI.js → te-kb-WYQWHFSC.js} +595 -85
- package/dist/{te-system-44LZJDTQ.js → te-system-7G6F2LJA.js} +6 -8
- package/dist/{te-team-XMP47YXE.js → te-team-E7FBBXMQ.js} +6 -8
- package/dist/{update-UODFOZ4P.js → update-D47BUG25.js} +7 -8
- package/package.json +13 -9
- package/skills/ae-agent/SKILL.md +30 -13
- package/skills/ae-agent/references/agent-distribution.md +94 -0
- package/skills/ae-agent/references/approval-request.md +4 -0
- package/skills/ae-agent/references/command_index.md +9 -2
- package/skills/ae-agent/references/create-automation.md +20 -2
- package/skills/ae-agent/references/get-agent-context.md +70 -0
- package/skills/ae-agent/references/list-automations.md +18 -3
- package/skills/ae-agent/references/list-mcp-credentials.md +1 -1
- package/skills/ae-agent/references/mcp-token.md +3 -3
- package/skills/ae-agent/references/set-mcp-credential.md +0 -1
- package/skills/ae-agent/references/update-automation.md +18 -0
- package/skills/ae-analysis/SKILL.md +28 -3
- package/skills/ae-analysis/references/adhoc_run.md +2 -0
- package/skills/ae-analysis/references/ai_models.md +23 -3
- package/skills/ae-analysis/references/analysis_gateway_assets.md +2 -2
- package/skills/ae-analysis/references/command_index.md +8 -8
- package/skills/ae-analysis/references/cross_source_config.md +84 -0
- package/skills/ae-analysis/references/dashboard_update.md +1 -1
- package/skills/ae-analysis/references/personal_semantic_preference_add.md +1 -1
- package/skills/ae-analysis/references/personal_semantic_preference_get.md +3 -1
- package/skills/ae-analysis/references/personal_semantic_preference_list.md +3 -1
- package/skills/ae-analysis/references/personal_semantic_preference_update.md +1 -1
- package/skills/ae-analysis/references/project_role_upsert.md +32 -2
- package/skills/ae-analysis/references/user_tag_create.md +23 -1
- package/skills/ae-analysis/references/user_tag_models.md +9 -1
- package/skills/ae-analysis/references/user_tag_update.md +14 -2
- package/skills/ae-data-integration/SKILL.md +2 -1
- package/skills/ae-data-integration/references/dimension-routing.md +36 -0
- package/skills/ae-data-integration/references/local-analysis.md +2 -0
- package/skills/ae-data-integration/references/source-inspect.md +1 -1
- package/skills/ae-data-integration/references/ue-routing.md +17 -1
- package/skills/ae-engage/SKILL.md +2 -0
- package/skills/ae-engage/references/save-flow.md +37 -1
- package/skills/ae-experiment/SKILL.md +117 -0
- package/skills/ae-experiment/references/batch_delete_experiment.md +11 -0
- package/skills/ae-experiment/references/batch_delete_feature.md +11 -0
- package/skills/ae-experiment/references/batch_delete_traffic_layer.md +11 -0
- package/skills/ae-experiment/references/cancel_experiment_query_by_request_id.md +11 -0
- package/skills/ae-experiment/references/check_experiment_ready.md +17 -0
- package/skills/ae-experiment/references/check_experiment_traffic_layer_conflict.md +37 -0
- package/skills/ae-experiment/references/delete_metric.md +13 -0
- package/skills/ae-experiment/references/manage_experiment.md +17 -0
- package/skills/ae-experiment/references/manage_feature_status.md +11 -0
- package/skills/ae-experiment/references/manage_feature_whitelist.md +66 -0
- package/skills/ae-experiment/references/manage_guardrail_metrics.md +26 -0
- package/skills/ae-experiment/references/query_bucket_list.md +12 -0
- package/skills/ae-experiment/references/query_experiment_detail.md +19 -0
- package/skills/ae-experiment/references/query_experiment_list.md +22 -0
- package/skills/ae-experiment/references/query_experiment_list_archived.md +18 -0
- package/skills/ae-experiment/references/query_experiment_metric_trend.md +12 -0
- package/skills/ae-experiment/references/query_experiment_operation_log.md +17 -0
- package/skills/ae-experiment/references/query_experiment_report_summary.md +12 -0
- package/skills/ae-experiment/references/query_experiment_sample_size_report.md +13 -0
- package/skills/ae-experiment/references/query_feature_detail.md +14 -0
- package/skills/ae-experiment/references/query_feature_list.md +12 -0
- package/skills/ae-experiment/references/query_feature_operation_log.md +19 -0
- package/skills/ae-experiment/references/query_feature_version_list.md +20 -0
- package/skills/ae-experiment/references/query_metric_detail.md +18 -0
- package/skills/ae-experiment/references/query_metric_list.md +15 -0
- package/skills/ae-experiment/references/query_traffic_layer_detail.md +13 -0
- package/skills/ae-experiment/references/query_traffic_layer_list.md +12 -0
- package/skills/ae-experiment/references/save_build_guide.md +39 -0
- package/skills/ae-experiment/references/save_experiment.md +210 -0
- package/skills/ae-experiment/references/save_feature.md +13 -0
- package/skills/ae-experiment/references/save_metric.md +91 -0
- package/skills/ae-experiment/references/save_submit_experiment.md +16 -0
- package/skills/ae-experiment/references/save_traffic_layer.md +13 -0
- package/skills/ae-experiment/references/save_validate.md +33 -0
- package/skills/ae-experiment/references/update_experiment_group.md +20 -0
- package/skills/ae-experiment-design/SKILL.md +149 -0
- package/skills/ae-experiment-design/agents/openai.yaml +4 -0
- package/skills/ae-experiment-design/references/client-experiment-sdk.md +147 -0
- package/skills/ae-experiment-design/references/experiment-creation.md +108 -0
- package/skills/ae-experiment-design/references/experiment-sdk-contract.md +100 -0
- package/skills/ae-experiment-design/references/exposure-contract.md +91 -0
- package/skills/ae-experiment-design/references/hybrid-experiment-sdk.md +74 -0
- package/skills/ae-experiment-design/references/metric-readiness.md +143 -0
- package/skills/ae-experiment-design/references/platform-operations.md +105 -0
- package/skills/ae-experiment-design/references/sdk-index.md +76 -0
- package/skills/ae-experiment-design/references/sdk-integration.md +114 -0
- package/skills/ae-experiment-design/references/sdk-troubleshooting.md +139 -0
- package/skills/ae-experiment-design/references/server-experiment-sdk.md +78 -0
- package/skills/ae-experiment-design/scripts/calculate_experiment_plan.py +450 -0
- package/skills/ae-experiment-insight/SKILL.md +149 -0
- package/skills/ae-experiment-insight/agents/openai.yaml +4 -0
- package/skills/ae-experiment-insight/references/decision-framework.md +69 -0
- package/skills/ae-experiment-insight/references/diagnostic-playbook.md +225 -0
- package/skills/ae-experiment-insight/references/platform-operations.md +82 -0
- package/skills/ae-experiment-insight/scripts/analyze_experiment.py +478 -0
- package/skills/ae-generate-tracking-plan/SKILL.md +16 -5
- package/skills/ae-kb/SKILL.md +107 -36
- package/skills/ae-kb/references/query-workflow.md +59 -29
- package/skills/ae-kb/references/versions.md +46 -0
- package/skills/ae-project-semantic/SKILL.md +193 -0
- package/skills/ae-project-semantic/references/query-routing-v5.md +165 -0
- package/skills/ae-project-semantic/references/recommendation-quality.md +68 -0
- package/skills/ae-system/SKILL.md +1 -1
- package/skills/ae-use-agent/SKILL.md +42 -0
- package/skills/ae-use-agent/references/local-agent.md +114 -0
- package/dist/auth-UMJAA72O.js +0 -15
- package/dist/chunk-533JK3YX.js +0 -72
- package/dist/chunk-O6K2ODUE.js +0 -318
- package/dist/chunk-RWXIXOZG.js +0 -326
- package/dist/client-N7NGZUNI.js +0 -204
- package/skills/ae-agent/references/auto-provision-mcp-credentials.md +0 -57
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# experiment metric save
|
|
2
|
+
|
|
3
|
+
Create or update a metric.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli experiment metric save --project-id <id> --req '<json>'
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Flags:
|
|
10
|
+
- `--project-id`, `-p`: Project ID.
|
|
11
|
+
- `--req`: Metric save request JSON object (**camelCase** keys such as `metricId`, `metricDefinition`).
|
|
12
|
+
|
|
13
|
+
Create mode requires metric identifiers and metric configuration. Modify mode uses `update=true`.
|
|
14
|
+
|
|
15
|
+
Do not paste `save build-guide` / `save validate` `example_args.req` keys (`metric_id`, …) into
|
|
16
|
+
`--req`. Those responses snake_case nested placeholders; final save requires camelCase.
|
|
17
|
+
See [`save_build_guide.md`](save_build_guide.md) / [`save_validate.md`](save_validate.md).
|
|
18
|
+
|
|
19
|
+
## Semantic Metric Contract
|
|
20
|
+
|
|
21
|
+
- Supply metric QP as `req.metricDefinition`.
|
|
22
|
+
- Never submit internal `metricConfig`, `calcType`, or an `Axxx` calculation code.
|
|
23
|
+
- Experiment metrics currently accept event definitions only.
|
|
24
|
+
- Event-property comparisons belong in `metricDefinition.filters`. Each item uses
|
|
25
|
+
`field`, `operator`, and `values`; do not place `operator` or `value` directly on
|
|
26
|
+
`metricDefinition`.
|
|
27
|
+
- Supported aggregations:
|
|
28
|
+
- Preset event metrics (omit `property`): `total_count`, `user_count`, `active_days`
|
|
29
|
+
- Property-based (**`property` REQUIRED**): `sum`, `avg`, `max`, `distinct_count`
|
|
30
|
+
- `avg_per_user` (`A105`) is not supported for experiment metric creation.
|
|
31
|
+
|
|
32
|
+
### Property rule (mandatory)
|
|
33
|
+
|
|
34
|
+
When `aggregation` is `sum`, `avg`, `max`, or `distinct_count`:
|
|
35
|
+
|
|
36
|
+
1. Resolve the event's available properties with Analysis metadata first
|
|
37
|
+
(`ae-cli analysis-meta property list` / `get` for that event).
|
|
38
|
+
2. Pass one concrete available property name in `metricDefinition.property`.
|
|
39
|
+
3. Do **not** invent placeholder metrics without a property (for example
|
|
40
|
+
`metric_avg_no_property_*`). Hermes rejects property aggregations with a blank
|
|
41
|
+
or missing `property`.
|
|
42
|
+
|
|
43
|
+
When `aggregation` is `total_count`, `user_count`, or `active_days`, omit `property`.
|
|
44
|
+
|
|
45
|
+
### Preset event metric example (no property)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
ae-cli experiment metric save --project-id 1 --req '{"metricId":"payment_users","metricName":"Payment users","createType":"event","goalDirection":"up","metricDesc":"Users who triggered payment","metricDefinition":{"type":"event","event":"payment","aggregation":"user_count"}}'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Correct example (avg with property)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
ae-cli experiment metric save --project-id 1 --req '{
|
|
55
|
+
"metricId":"startup_style_payment_avg_20260729",
|
|
56
|
+
"metricName":"Startup style payment avg",
|
|
57
|
+
"createType":"event",
|
|
58
|
+
"goalDirection":"up",
|
|
59
|
+
"metricDesc":"Average payment amount",
|
|
60
|
+
"metricDefinition":{
|
|
61
|
+
"type":"event",
|
|
62
|
+
"event":"payment",
|
|
63
|
+
"aggregation":"avg",
|
|
64
|
+
"property":"amount",
|
|
65
|
+
"filters":{
|
|
66
|
+
"relation":"and",
|
|
67
|
+
"items":[{"field":"amount","operator":"gt","values":[10]}]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Wrong example (avg without property — rejected)
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"metricId": "metric_avg_no_property_actual_20260729_144230",
|
|
78
|
+
"metricDefinition": {
|
|
79
|
+
"type": "event",
|
|
80
|
+
"event": "payment",
|
|
81
|
+
"aggregation": "avg"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Filters use the semantic `filters` tree with `relation=and|or` and items containing
|
|
87
|
+
`field`, `operator`, and `values`. For the frontend example `gold > 10`, use:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{"filters":{"relation":"and","items":[{"field":"gold","operator":"gt","values":[10]}]}}
|
|
91
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# capability run experiment.experiment.save-submit
|
|
2
|
+
|
|
3
|
+
Create or update a complete experiment and submit it in one call.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli capability run experiment.experiment.save-submit --input '{"project_id":1,"req":{...}}'
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Input fields: `project_id` and `req`. The outer input is snake_case; fields inside `req` keep the native camelCase DTO shape.
|
|
10
|
+
|
|
11
|
+
Custom audiences use semantic `req.targeting.definitionRequest`. Never pass the
|
|
12
|
+
internal `targetConfig` field or hand-write `Cxx`/`Axxx` codes.
|
|
13
|
+
|
|
14
|
+
Response shape: `data.result`, with object keys recursively converted to snake_case.
|
|
15
|
+
|
|
16
|
+
Prefer `experiment experiment save` for progressive draft construction.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# experiment traffic-layer save
|
|
2
|
+
|
|
3
|
+
Create or update a traffic layer.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli experiment traffic-layer save --project-id <id> --req '<json>'
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Flags:
|
|
10
|
+
- `--project-id`, `-p`: Project ID.
|
|
11
|
+
- `--req`: Traffic layer save request JSON object.
|
|
12
|
+
|
|
13
|
+
Create mode requires `bucketId`, `layerName`, and `layerType` in the request. Modify mode requires `layerId`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# experiment save validate
|
|
2
|
+
|
|
3
|
+
Dry-run helper for save payloads. Does **not** persist data.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli experiment save validate --project-id <id> --operation-mode save_experiment --req '{"expName":"Demo"}'
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Flags:
|
|
10
|
+
- `--project-id`, `-p`: Project ID.
|
|
11
|
+
- `--operation-mode`: `save_feature`, `save_traffic_layer`, `save_experiment`, or `save_metric`.
|
|
12
|
+
- `--req`: Candidate save request object. **Must use native camelCase DTO keys.**
|
|
13
|
+
|
|
14
|
+
## CRITICAL — `valid: true` is not a save schema pass
|
|
15
|
+
|
|
16
|
+
`experiment.save.validate` checks operation-mode / outer helper contract. It does **not**
|
|
17
|
+
fully enforce the final save capability `input_schema`.
|
|
18
|
+
|
|
19
|
+
Consequences:
|
|
20
|
+
|
|
21
|
+
- `--req '{"exp_name":"Demo"}'` can return `valid: true`.
|
|
22
|
+
- The same payload fails on `experiment experiment save` with `unknown field exp_name`.
|
|
23
|
+
|
|
24
|
+
Rules:
|
|
25
|
+
|
|
26
|
+
1. Never submit snake_case DTO keys in `--req` (`exp_name`, `metric_id`, `feature_key`, …).
|
|
27
|
+
2. Do not trust `data.validation.example_args.req` key casing; rebuild with camelCase.
|
|
28
|
+
3. After `valid: true`, still use camelCase and prefer
|
|
29
|
+
`ae-cli … save --dry-run` / `capability inspect` before a real write.
|
|
30
|
+
4. On final save `INVALID_CAPABILITY_INPUT` / `unknown field`, fix casing — do not widen
|
|
31
|
+
the payload with more snake_case keys.
|
|
32
|
+
|
|
33
|
+
Response shape: `data.validation`.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# experiment experiment update-group
|
|
2
|
+
|
|
3
|
+
Update only the business group of one experiment.
|
|
4
|
+
|
|
5
|
+
Reuses Hermes `POST /v1/atlas/experiment/updateGroup`. This dedicated endpoint
|
|
6
|
+
updates `group_id` only and does not go through full experiment `modify`, so it
|
|
7
|
+
will not rewrite traffic, variants, metrics, or other fields.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ae-cli experiment experiment update-group --project-id <id> --exp-id <exp-id> --group-id <group-id>
|
|
11
|
+
ae-cli experiment experiment update-group --project-id <id> --exp-id <exp-id> --group-id 0 --dry-run
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Flags:
|
|
15
|
+
- `--project-id`, `-p`: Project ID.
|
|
16
|
+
- `--exp-id`: Experiment ID.
|
|
17
|
+
- `--group-id`: Target business group ID. Use `0` for ungrouped.
|
|
18
|
+
|
|
19
|
+
Response shape: `data.result` is `true` when the update succeeds. Blank
|
|
20
|
+
`--group-id` is normalized to `0` on the server.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ae-experiment-design
|
|
3
|
+
description: "Design AE/TE A/B experiments from a business goal through a reviewable draft. Use when the user asks to form an experiment hypothesis, assess metric readiness, choose or create metrics and Features, design groups or traffic, estimate sample size or duration, create an experiment draft, or run readiness and conflict checks. SDK guidance is a conditional branch: enter it only when the user explicitly asks about an A/B experiment SDK, client SDK integration, experiment SDK code generation, or SDK troubleshooting; do not include SDK work in an ordinary experiment-design or draft-creation request."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AE Experiment Design and Integration
|
|
7
|
+
|
|
8
|
+
Turn a business objective into an evidence-backed experiment design, an implementation contract, and, when requested and supported, an AE experiment draft.
|
|
9
|
+
|
|
10
|
+
## Hard boundaries
|
|
11
|
+
|
|
12
|
+
- Use `ae-cli` for every AE/TE platform interaction. Do not substitute raw HTTP, browser automation, direct database queries, or application SDKs.
|
|
13
|
+
- Do not infer an SDK request from the fact that an experiment needs implementation. Load SDK references only when the user explicitly asks about an A/B experiment SDK or client SDK integration.
|
|
14
|
+
- Do not copy general tracking SDK documentation into this Skill. Route generic initialization, event reporting, `track`, user identity, user properties, data upload, LogBus, and REST questions to `ae-data-integration-helper` when that Skill is available.
|
|
15
|
+
- Use only the event-metric calculation contracts defined in
|
|
16
|
+
`metric-readiness.md`. Bind one confirmed primary event metric and do not add
|
|
17
|
+
unsupported metric roles.
|
|
18
|
+
- Never claim that a platform asset exists, was created, passed a check, or generated project code without a successful `ae-cli` response.
|
|
19
|
+
- Never invent platform IDs, schemas, SDK APIs, versions, defaults, or behavior.
|
|
20
|
+
|
|
21
|
+
## Progressive disclosure router
|
|
22
|
+
|
|
23
|
+
Read only the references needed for the current request:
|
|
24
|
+
|
|
25
|
+
| Request | Required references |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Any AE/TE platform read or write | [`references/platform-operations.md`](references/platform-operations.md) |
|
|
28
|
+
| Create or reuse an experiment draft | [`references/experiment-creation.md`](references/experiment-creation.md) and [`references/platform-operations.md`](references/platform-operations.md) |
|
|
29
|
+
| Metric selection, feasibility, or creation | [`references/metric-readiness.md`](references/metric-readiness.md) |
|
|
30
|
+
| Explicit A/B experiment SDK or client SDK integration request | [`references/sdk-integration.md`](references/sdk-integration.md) |
|
|
31
|
+
| Exact SDK version, dependency, class, or source lookup | [`references/sdk-index.md`](references/sdk-index.md) |
|
|
32
|
+
| Cross-platform Feature, default, fetch, cache, or assignment behavior | [`references/experiment-sdk-contract.md`](references/experiment-sdk-contract.md) |
|
|
33
|
+
| Android, iOS, or JavaScript experiment SDK | [`references/client-experiment-sdk.md`](references/client-experiment-sdk.md) |
|
|
34
|
+
| Server-side assignment or evaluation | [`references/server-experiment-sdk.md`](references/server-experiment-sdk.md) |
|
|
35
|
+
| Server assignment with client rendering | [`references/hybrid-experiment-sdk.md`](references/hybrid-experiment-sdk.md) |
|
|
36
|
+
| Exposure design, deduplication, or metric join | [`references/exposure-contract.md`](references/exposure-contract.md) |
|
|
37
|
+
| SDK retrieval, default, identity, exposure, or debug issue | [`references/sdk-troubleshooting.md`](references/sdk-troubleshooting.md) |
|
|
38
|
+
|
|
39
|
+
References are a curated fast path, not the whole documentation set.
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
### 1. Frame the decision
|
|
44
|
+
|
|
45
|
+
Extract:
|
|
46
|
+
|
|
47
|
+
- business goal and desired direction;
|
|
48
|
+
- experiment variable and user-visible change;
|
|
49
|
+
- target population and exclusions;
|
|
50
|
+
- decision that the result must support;
|
|
51
|
+
- success threshold.
|
|
52
|
+
|
|
53
|
+
Convert these into a falsifiable hypothesis. Clarify only missing facts that materially change the design. For a conversion goal, establish the population, denominator or exposure behavior, numerator behavior, attribution window, and analysis unit.
|
|
54
|
+
|
|
55
|
+
Do not silently invent a target population, conversion definition, or technical platform.
|
|
56
|
+
|
|
57
|
+
### 2. Resolve the project and evidence
|
|
58
|
+
|
|
59
|
+
Pass the project gate in `platform-operations.md`. With `ae-cli`, establish candidate exposure and outcome events, assignment identity and join path, timestamps, exact saved-metric definitions, and—when available—baseline and eligible traffic.
|
|
60
|
+
|
|
61
|
+
If the project is unavailable, accept user-provided schemas or definitions and label all platform-dependent conclusions as unverified.
|
|
62
|
+
|
|
63
|
+
### 3. Assess metric readiness
|
|
64
|
+
|
|
65
|
+
Apply `metric-readiness.md`. Classify candidates as `recommended`, `available`,
|
|
66
|
+
`blocked`, or `unverified`; recommend one primary event metric and confirm its
|
|
67
|
+
calculation code before planning sample size or duration.
|
|
68
|
+
|
|
69
|
+
### 4. Design Feature, assignment, and groups
|
|
70
|
+
|
|
71
|
+
Define the Feature key, type, typed default, ownership, stable assignment unit, one control group, treatment groups, group values, traffic, allocations, layer, targeting, and exclusions.
|
|
72
|
+
|
|
73
|
+
Require allocations totaling `1.0`, experiment traffic in `(0, 1]`, type-correct values, a stable exposure-to-outcome identity join, and at least one primary metric. Resolve real Features and layers with `ae-cli` before reuse or creation.
|
|
74
|
+
|
|
75
|
+
### 5. Calculate sample size and duration
|
|
76
|
+
|
|
77
|
+
Follow this order: confirm the primary metric and calculation code → obtain its
|
|
78
|
+
baseline, MDE, and any required variance → calculate the sample target with
|
|
79
|
+
[`scripts/calculate_experiment_plan.py`](scripts/calculate_experiment_plan.py)
|
|
80
|
+
→ derive duration from the sample target and effective eligible daily units.
|
|
81
|
+
Apply the preregistered planning policy in `metric-readiness.md`. Use fixed
|
|
82
|
+
`alpha=0.05` and two-sided testing, policy-default `power=0.80`, and Bonferroni
|
|
83
|
+
planning for multiple treatments. Require the MDE type and direction; never
|
|
84
|
+
default MDE to 5% or assume variance for a continuous metric.
|
|
85
|
+
|
|
86
|
+
When experiment traffic is already confirmed, calculate its duration. When it
|
|
87
|
+
is not confirmed, obtain verified layer capacity and let the script recommend
|
|
88
|
+
the smallest absolute traffic candidate that reaches the target within the
|
|
89
|
+
maximum runtime. Default to at least seven days and full-week alignment. Return
|
|
90
|
+
the actual infeasible duration instead of truncating it. Explain the baseline,
|
|
91
|
+
MDE, power source, allocations, multiplicity rule, traffic evidence, sample
|
|
92
|
+
targets, duration adjustment, and any native-report mismatch. Do not return a
|
|
93
|
+
definitive plan when required evidence is unavailable.
|
|
94
|
+
|
|
95
|
+
### 6. Materialize the design
|
|
96
|
+
|
|
97
|
+
For an explicit draft-creation request, follow `experiment-creation.md` and `platform-operations.md`. Create only authorized draft assets, verify the saved result by reading it back, run supported readiness and conflict checks, and return the compact receipt and experiment link defined there.
|
|
98
|
+
|
|
99
|
+
Submitting, starting, changing live traffic, pausing, ending, or deleting requires separate explicit confirmation. Never turn draft creation into launch.
|
|
100
|
+
|
|
101
|
+
## Output requirements
|
|
102
|
+
|
|
103
|
+
- Use the language explicitly requested by the user. Otherwise, use the language of the user's latest substantive message.
|
|
104
|
+
- Localize all user-visible prose, including headings, table headers, field labels, status names, recommendations, warnings, assumptions, and next actions.
|
|
105
|
+
- Keep code, commands, raw IDs, event/property/metric names, Feature keys, SDK/API names, and official enum values unchanged when translation would alter their technical meaning.
|
|
106
|
+
- Treat section names in this Skill as semantic guidance, not literal output text. Do not copy an English heading into a non-English response.
|
|
107
|
+
- For a design request, lead with the experiment recommendation. For a creation, validation, or conflict-check request, lead with the operation outcome.
|
|
108
|
+
- Include only the smallest set of relevant sections; do not reproduce every workflow stage.
|
|
109
|
+
- Separate observed platform evidence, verified documentation, deterministic calculations, design judgments, and unresolved assumptions.
|
|
110
|
+
- Before responding, check every heading, table header, label, and status for unintended mixed-language output.
|
|
111
|
+
|
|
112
|
+
Treat project resolution, metadata discovery, candidate-event searches, metric comparison, Feature and layer inventory, capability discovery, schema inspection, and command execution as internal working context.
|
|
113
|
+
|
|
114
|
+
- Do not narrate the execution sequence in the final answer. Omit phrases such as "first load the reference", "now query in parallel", "verified with ae-cli", or "the evidence collection is complete".
|
|
115
|
+
- Do not expose raw commands, capability IDs, request schemas, full candidate lists, or a platform-evidence dump unless the user explicitly asks for the evidence, audit trail, or debugging details.
|
|
116
|
+
- Surface platform evidence only when it changes the design, blocks the operation, reveals a material semantic mismatch, or requires user confirmation. Summarize it in at most three concise bullets by default.
|
|
117
|
+
- Do not repeat the full experiment design after a creation request unless the user explicitly asks for the complete design.
|
|
118
|
+
- Do not expose hidden reasoning. Give the conclusion, the user-relevant basis, and the action result.
|
|
119
|
+
|
|
120
|
+
## Failure behavior
|
|
121
|
+
|
|
122
|
+
- Missing project or ambiguous host: show candidates and ask; do not guess.
|
|
123
|
+
- Missing metadata: return the required event, property, identity, and timestamp checklist.
|
|
124
|
+
- Experiment product unavailable:
|
|
125
|
+
- State that the project has not enabled the experiment product only when an
|
|
126
|
+
explicit platform entitlement result establishes that fact. A missing
|
|
127
|
+
capability alone means the experiment capability is unavailable, not that
|
|
128
|
+
the product was not purchased.
|
|
129
|
+
- For a design request, tell the user that experiment design can continue,
|
|
130
|
+
but Feature, layer, metric, and traffic details cannot be verified on the
|
|
131
|
+
platform. Continue with an offline design and request the baseline, MDE,
|
|
132
|
+
and eligible daily units when sample-size or duration planning needs them.
|
|
133
|
+
- For a draft-creation request, lead with the outcome that the experiment
|
|
134
|
+
draft was not created. Explain that Feature, layer, and draft creation are
|
|
135
|
+
blocked, preserve the proposed design, and say that platform creation and
|
|
136
|
+
readiness checks can continue after the product is enabled or the required
|
|
137
|
+
access is granted.
|
|
138
|
+
- HTTP 403 or equivalent permission denial: state that the current account
|
|
139
|
+
lacks the required experiment permission, stop dependent writes, and explain
|
|
140
|
+
that this result does not establish whether the project purchased the
|
|
141
|
+
experiment product. Ask the project administrator to check both product
|
|
142
|
+
availability and the user's project permissions.
|
|
143
|
+
- Capability gap without an explicit entitlement or permission result: report
|
|
144
|
+
that the current environment does not expose the required experiment
|
|
145
|
+
capability, continue with an offline design when useful, and do not bypass
|
|
146
|
+
`ae-cli`.
|
|
147
|
+
- For SDK gaps or conflicts, follow `sdk-integration.md`; do not invent exact code.
|
|
148
|
+
- Validation failure: correct documented input or ask for the missing value; do not retry unchanged input.
|
|
149
|
+
- Partial success: report created and failed assets separately and never imply atomic success.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Experiment Design & Integration"
|
|
3
|
+
short_description: "Design AE experiments with optional SDK guidance"
|
|
4
|
+
default_prompt: "Use $ae-experiment-design to design an A/B experiment and prepare an AE draft; include SDK guidance only when I explicitly request it."
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Client Experiment SDK
|
|
2
|
+
|
|
3
|
+
Read this reference for Android, iOS, or browser JavaScript experiment integration. Read `sdk-index.md` first and verify the current main document before producing production code.
|
|
4
|
+
|
|
5
|
+
## Shared client model
|
|
6
|
+
|
|
7
|
+
All three verified client pages describe the same model:
|
|
8
|
+
|
|
9
|
+
- analytics SDK handles data collection;
|
|
10
|
+
- Remote Config retrieves AE configuration;
|
|
11
|
+
- experiment SDK provides typed Feature getters and exposure;
|
|
12
|
+
- automatic exposure is enabled through `automaticExposureTracking`;
|
|
13
|
+
- manual exposure is available when activation does not coincide with the getter;
|
|
14
|
+
- a custom bucket map can override the default assignment subject;
|
|
15
|
+
- custom fetch parameters can be attached to configuration requests;
|
|
16
|
+
- an explicit fetch can refresh experiment information.
|
|
17
|
+
|
|
18
|
+
## Android
|
|
19
|
+
|
|
20
|
+
Verified document state: `TDExperiment` 1.0.1, updated 2026-07-24.
|
|
21
|
+
|
|
22
|
+
Dependencies:
|
|
23
|
+
|
|
24
|
+
- `TDAnalytics` >= 3.3.6
|
|
25
|
+
- `TDRemoteConfig` >= 1.3.0
|
|
26
|
+
- automatic package: `cn.thinkingdata.android:TDExperiment:1.0.1`
|
|
27
|
+
|
|
28
|
+
Initialization order:
|
|
29
|
+
|
|
30
|
+
```java
|
|
31
|
+
TDAnalytics.init(context, "APP_ID", "https://YOUR_SERVER_URL");
|
|
32
|
+
|
|
33
|
+
TDExperimentConfig config =
|
|
34
|
+
new TDExperimentConfig("APP_ID", "https://YOUR_SERVER_URL");
|
|
35
|
+
config.automaticExposureTracking = true;
|
|
36
|
+
TDExperiment.init(context, config);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Verified operations:
|
|
40
|
+
|
|
41
|
+
```java
|
|
42
|
+
TDExperiment.getValueAsString(key);
|
|
43
|
+
TDExperiment.getValueAsDouble(key);
|
|
44
|
+
TDExperiment.getValueAsBoolean(key);
|
|
45
|
+
TDExperiment.getValueAsJson(key);
|
|
46
|
+
TDExperiment.exposure(key);
|
|
47
|
+
TDExperiment.fetch();
|
|
48
|
+
TDExperiment.setCustomBucketId(bucketId);
|
|
49
|
+
TDExperiment.setCustomFetchParams(params);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Use the initialization callback for first-fetch success or error. `TDExperiment.enableLog(true)` enables experiment logging.
|
|
53
|
+
|
|
54
|
+
The verified page does not show typed-default overloads for Android getters. Keep an application-owned typed control default and verify whether a newer SDK adds overloads.
|
|
55
|
+
|
|
56
|
+
## iOS
|
|
57
|
+
|
|
58
|
+
Verified document state: `TDExperiment` 1.0.2, updated 2026-07-24.
|
|
59
|
+
|
|
60
|
+
Dependencies:
|
|
61
|
+
|
|
62
|
+
- `ThinkingSDK` >= 3.1.6
|
|
63
|
+
- `TDRemoteConfig` >= 1.3.1
|
|
64
|
+
- CocoaPods: `pod 'TDExperiment', '1.0.2'`
|
|
65
|
+
- minimum deployment target shown by the experiment page: iOS 9.0
|
|
66
|
+
|
|
67
|
+
Initialization order:
|
|
68
|
+
|
|
69
|
+
```objective-c
|
|
70
|
+
[TDAnalytics startAnalyticsWithAppId:@"APP_ID"
|
|
71
|
+
serverUrl:@"https://YOUR_SERVER_URL"];
|
|
72
|
+
|
|
73
|
+
TDExperimentConfig *config =
|
|
74
|
+
[[TDExperimentConfig alloc] initWithAppId:@"APP_ID"
|
|
75
|
+
serverUrl:@"https://YOUR_SERVER_URL"];
|
|
76
|
+
config.automaticExposureTracking = YES;
|
|
77
|
+
[TDExperiment startWithConfig:config];
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Verified getters support no-argument defaults and explicit defaults:
|
|
81
|
+
|
|
82
|
+
```objective-c
|
|
83
|
+
[TDExperiment getValueAsString:key defaultValue:@"default"];
|
|
84
|
+
[TDExperiment getValueAsNumber:key defaultValue:@0];
|
|
85
|
+
[TDExperiment getValueAsBoolean:key defaultValue:NO];
|
|
86
|
+
[TDExperiment getValueAsJson:key defaultValue:@{}];
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Other verified operations:
|
|
90
|
+
|
|
91
|
+
```objective-c
|
|
92
|
+
[TDExperiment exposure:key];
|
|
93
|
+
[TDExperiment fetch];
|
|
94
|
+
[TDExperiment setCustomBucketId:bucketId];
|
|
95
|
+
[TDExperiment setCustomFetchParams:params];
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use `TDExperimentTask` listeners for startup or fetch success and failure. `[TDExperiment enableLog:YES]` enables experiment logging.
|
|
99
|
+
|
|
100
|
+
## JavaScript
|
|
101
|
+
|
|
102
|
+
Verified document state: experiment package 1.0.0, updated 2026-07-24.
|
|
103
|
+
|
|
104
|
+
Dependencies:
|
|
105
|
+
|
|
106
|
+
- `TDAnalytics` >= 2.6.0
|
|
107
|
+
- `TDRemoteconfig` >= 1.3.0
|
|
108
|
+
- files shown by the page: `thinkingdata.umd.min.js`, `tdremoteconfig.umd.min.js`, `tdexperiment.umd.min.js`
|
|
109
|
+
|
|
110
|
+
The page initializes analytics first and then the experiment global with:
|
|
111
|
+
|
|
112
|
+
- `appId`
|
|
113
|
+
- `serverUrl`
|
|
114
|
+
- `automaticExposureTracking`
|
|
115
|
+
- `customBucketId`
|
|
116
|
+
- `customFetchParams`
|
|
117
|
+
- `enableLog`
|
|
118
|
+
- fetch success and failure callbacks
|
|
119
|
+
|
|
120
|
+
The page shows typed getters, manual exposure, fetch, custom bucket ID, and custom fetch parameters.
|
|
121
|
+
|
|
122
|
+
### Spelling gate
|
|
123
|
+
|
|
124
|
+
The verified page spells the global object `TDExpriment`. Treat this as unresolved until the downloaded 1.0.0 package or a newer verified main document confirms the export. Do not silently change it, and do not publish exact JavaScript code based only on the page.
|
|
125
|
+
|
|
126
|
+
## Remote Config companion behavior
|
|
127
|
+
|
|
128
|
+
The verified Remote Config pages show:
|
|
129
|
+
|
|
130
|
+
- local defaults when no remote value is available;
|
|
131
|
+
- value order: remote, local default, then empty;
|
|
132
|
+
- a successful-fetch update listener;
|
|
133
|
+
- status information for strategies changed to `suspend` or `force_offline`;
|
|
134
|
+
- debug/test mode polling every five seconds for test strategies;
|
|
135
|
+
- test-device selection for client send testing.
|
|
136
|
+
|
|
137
|
+
These are Remote Config behaviors. Do not imply that the experiment SDK itself polls every five seconds in production.
|
|
138
|
+
|
|
139
|
+
## Client implementation checklist
|
|
140
|
+
|
|
141
|
+
- Verify all three SDK versions together.
|
|
142
|
+
- Initialize on the documented thread or lifecycle point.
|
|
143
|
+
- Set assignment identity before first fetch or getter.
|
|
144
|
+
- Use a typed control default.
|
|
145
|
+
- Choose automatic or manual exposure, not both.
|
|
146
|
+
- Freeze behavior when a mid-session update would cause flicker.
|
|
147
|
+
- Test control, treatment, no-network, timeout, account switch, and stale-cache cases.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Experiment Draft Creation
|
|
2
|
+
|
|
3
|
+
Use this reference when the user asks to create, save, or reuse an A/B experiment draft.
|
|
4
|
+
|
|
5
|
+
## Execution boundary
|
|
6
|
+
|
|
7
|
+
- Perform every platform read or write through `ae-cli`.
|
|
8
|
+
- Discover and inspect the current capability before constructing input.
|
|
9
|
+
- Do not assume Feature, layer, metric, group, targeting, duration, or traffic fields before inspecting the current schema.
|
|
10
|
+
|
|
11
|
+
## Creation contract gate
|
|
12
|
+
|
|
13
|
+
Before writing a draft, establish the minimum semantic contract:
|
|
14
|
+
|
|
15
|
+
1. verified project ID and host;
|
|
16
|
+
2. experiment variable and the user-visible or system behavior that changes;
|
|
17
|
+
3. experiment goal and one primary metric with an exact feasible definition;
|
|
18
|
+
4. target population and material exclusions;
|
|
19
|
+
5. stable assignment unit and identity join path;
|
|
20
|
+
6. one control group and at least one treatment group, with typed Feature values and allocations totaling `1.0`;
|
|
21
|
+
7. experiment traffic, targeting, and a resolved layer or explicit new-layer plan;
|
|
22
|
+
8. Feature ownership, key, type, and typed default;
|
|
23
|
+
9. when the draft requires a duration, a confirmed sample target and
|
|
24
|
+
formula-derived duration.
|
|
25
|
+
|
|
26
|
+
Do not create a prose-only shell that leaves the experiment variable, group behavior, primary metric, target population, or assignment identity undefined. Ask one focused question at a time when a missing answer materially changes the draft.
|
|
27
|
+
|
|
28
|
+
## Design heuristics are not platform facts
|
|
29
|
+
|
|
30
|
+
Use these only as recommendations and verify that the identity exists and remains stable:
|
|
31
|
+
|
|
32
|
+
- pre-login experience: usually `#distinct_id` or a stable device identity;
|
|
33
|
+
- authenticated user experience: usually `#user_id`;
|
|
34
|
+
- account-wide B2B behavior: an account identity;
|
|
35
|
+
- device-specific rendering or performance: a device identity.
|
|
36
|
+
|
|
37
|
+
Do not silently choose an assignment identity. Explain the material identity risk and obtain confirmation when more than one viable identity changes who receives a consistent experience.
|
|
38
|
+
|
|
39
|
+
## Authorization gate
|
|
40
|
+
|
|
41
|
+
A draft write is authorized when either condition holds:
|
|
42
|
+
|
|
43
|
+
- the user reviewed the proposed design and then explicitly asked to create or confirmed creation; or
|
|
44
|
+
- the user's current request explicitly says to create and already provides an exact, complete creation contract.
|
|
45
|
+
|
|
46
|
+
If the design contains recommended or inferred choices that the user has not reviewed and those choices materially affect assignment, audience, behavior, metrics, or traffic, show a compact plan summary and ask for confirmation before writing.
|
|
47
|
+
|
|
48
|
+
Do not ask for redundant confirmation when the user has already confirmed the unchanged plan. Design-only language is not authorization to create. Draft authorization never authorizes submit, start, live traffic changes, pause, end, or delete.
|
|
49
|
+
|
|
50
|
+
## Resolution and idempotency
|
|
51
|
+
|
|
52
|
+
Before creating assets:
|
|
53
|
+
|
|
54
|
+
1. resolve the project;
|
|
55
|
+
2. search for exact or likely duplicate experiment drafts;
|
|
56
|
+
3. inspect any likely duplicate before deciding to reuse it;
|
|
57
|
+
4. resolve the exact Feature, layer, and metrics;
|
|
58
|
+
5. verify definitions, types, defaults, ownership, status, and remaining traffic;
|
|
59
|
+
6. identify existing active or draft experiments that may interact with the same Feature, layer, audience, or identity.
|
|
60
|
+
|
|
61
|
+
Reuse only an exact semantic match. Similar names are not enough. If an exact-match draft already exists, reuse it and report that outcome instead of creating a duplicate.
|
|
62
|
+
|
|
63
|
+
An empty list is not proof of no conflict. Only a supported conflict check can justify a user-facing "no conflict" result.
|
|
64
|
+
|
|
65
|
+
## Materialization sequence
|
|
66
|
+
|
|
67
|
+
Use the inspected schemas and execute only the steps required for this design:
|
|
68
|
+
|
|
69
|
+
1. create or reuse an exact metric when its definition is complete;
|
|
70
|
+
2. create or reuse an inactive Feature with the correct type and default;
|
|
71
|
+
3. create or reuse a compatible layer with verified assignment identity and sufficient traffic;
|
|
72
|
+
4. assemble experiment name, falsifiable hypothesis, Feature bindings, groups, allocations, traffic, targeting, metrics, and any required schedule fields;
|
|
73
|
+
5. validate or dry-run once when appropriate under `platform-operations.md`;
|
|
74
|
+
6. save the experiment as a draft;
|
|
75
|
+
7. read back the draft and verify its persisted fields;
|
|
76
|
+
8. run supported readiness and conflict checks;
|
|
77
|
+
9. return a concise creation receipt and experiment-detail link.
|
|
78
|
+
|
|
79
|
+
Do not claim atomic success when supporting assets were created but the experiment save failed. Report created, reused, failed, and unresolved assets separately.
|
|
80
|
+
Immediately before saving, revalidate the creation contract against the inspected schema and ensure no proposed ID is being presented as an existing platform ID.
|
|
81
|
+
|
|
82
|
+
## Post-save verification
|
|
83
|
+
|
|
84
|
+
A successful write response is not sufficient by itself. Read back the saved or reused draft and verify, when returned by the platform:
|
|
85
|
+
|
|
86
|
+
- actual experiment ID and name;
|
|
87
|
+
- project ID;
|
|
88
|
+
- draft status;
|
|
89
|
+
- Feature and layer bindings;
|
|
90
|
+
- group names, values, and allocations;
|
|
91
|
+
- experiment traffic and targeting;
|
|
92
|
+
- primary event metric and calculation code.
|
|
93
|
+
|
|
94
|
+
Run readiness and conflict checks only when supported. Report each check separately and do not translate "not run" into "passed".
|
|
95
|
+
|
|
96
|
+
## User-visible completion
|
|
97
|
+
|
|
98
|
+
Return an operation receipt, not the discovery log. Include:
|
|
99
|
+
|
|
100
|
+
- created, reused, partially completed, blocked, or failed;
|
|
101
|
+
- experiment name, actual ID, and draft status;
|
|
102
|
+
- control and treatment values and allocations;
|
|
103
|
+
- experiment traffic and primary metric;
|
|
104
|
+
- readiness and conflict results that actually ran;
|
|
105
|
+
- at most three material blockers or semantic risks;
|
|
106
|
+
- the clickable experiment-detail link required by `SKILL.md`.
|
|
107
|
+
|
|
108
|
+
Do not expose raw candidate lists, capability discovery, request schemas, commands, or internal execution narration unless the user explicitly asks for an audit or debugging view.
|