@thinkingai/ae-cli 6.1.9 → 6.1.11
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 +25 -3
- package/README.zh.md +25 -3
- package/dist/{auth-56Z45UVR.js → auth-GDV3H5I4.js} +18 -8
- package/dist/{auth-ENM3FE6L.js → auth-NN55553T.js} +3 -3
- package/dist/{capability-2H6PAOA3.js → capability-TPORIKRQ.js} +19 -15
- package/dist/{capability-YPOQX6PL.js → capability-VQNC5CF7.js} +19 -15
- package/dist/chunk-4NN5IWVN.js +26 -0
- package/dist/{chunk-DB4Q3ANU.js → chunk-6A2FUCIS.js} +3 -3
- package/dist/{chunk-PVBYJWC2.js → chunk-7KQWSBSL.js} +4 -4
- package/dist/{chunk-24BAVOX3.js → chunk-AXDXJTPC.js} +3 -1
- package/dist/{chunk-CPVTECJ3.js → chunk-DT6Y3TD7.js} +5 -5
- package/dist/{chunk-EGEIXA2Z.js → chunk-DWO43OIB.js} +0 -248
- package/dist/{chunk-V6FR6WTW.js → chunk-GJJA4CQZ.js} +34 -2
- package/dist/{chunk-RGXCNC4N.js → chunk-GS2P7LFD.js} +50 -17
- package/dist/{chunk-LYVNONC4.js → chunk-JHENBQ5B.js} +35 -0
- package/dist/{chunk-3P3562ZX.js → chunk-MVDZ7DBQ.js} +5 -5
- package/dist/{chunk-LCXU3AAT.js → chunk-NBPKWKRA.js} +2 -2
- package/dist/{chunk-HQ2A7ITL.js → chunk-RBNKI5ZW.js} +50 -17
- package/dist/{chunk-LHVM35J4.js → chunk-TS6BUGUY.js} +4 -4
- package/dist/chunk-TUKQZTMI.js +250 -0
- package/dist/{chunk-J7MZHDHQ.js → chunk-VKD5WQKN.js} +5 -5
- package/dist/{chunk-3KI3RRXX.js → chunk-VTXHDCBW.js} +3 -3
- package/dist/{chunk-KTYR3U6D.js → chunk-YTG6Q75E.js} +10 -6
- package/dist/{chunk-IR4ZLVPW.js → chunk-YV52FB5G.js} +25 -3
- package/dist/{chunk-E7UXXHO3.js → chunk-Z3OXWCIA.js} +3 -3
- package/dist/{cli-token-4SBMXAUK.js → cli-token-GL5MS5FK.js} +4 -4
- package/dist/{client-PP5FETMW.js → client-DAIPF7XN.js} +4 -4
- package/dist/{community-report-client-KK2QBANO.js → community-report-client-M2RW4MXD.js} +2 -2
- package/dist/config-4VZNLBKF.js +489 -0
- package/dist/index.js +94 -35
- package/dist/memory-RWJW4XFO.js +892 -0
- package/dist/memory-VO2ZJCRT.js +892 -0
- package/dist/{metadata-JIQ77HFY.js → metadata-YGTHR2XJ.js} +8 -8
- package/dist/{metadata-AN3YFZEV.js → metadata-ZRN2GHPN.js} +8 -8
- package/dist/{model-JASQVOFD.js → model-CLUIK3K5.js} +7 -5
- package/dist/{raw-XJCAT3HX.js → raw-52B4UKO4.js} +8 -7
- package/dist/sync-3REDHGY6.js +10259 -0
- package/dist/{te-agent-JHUG6DVV.js → te-agent-XNPELAKX.js} +580 -84
- package/dist/{te-analysis-IWQZO423.js → te-analysis-GJI5FZUL.js} +1611 -25
- package/dist/{te-analysis-X222IRYR.js → te-analysis-N2BRDJZ5.js} +1611 -25
- package/dist/{te-community-QOYIYEJI.js → te-community-SQXKE5OO.js} +7 -7
- package/dist/{te-community-UFKI6ONP.js → te-community-TYSNU3NQ.js} +7 -7
- package/dist/{te-dataops-PZQ5NQLY.js → te-dataops-5TM7WZDI.js} +370 -189
- package/dist/{te-dataops-XTWVTJCA.js → te-dataops-OWIADNSM.js} +370 -189
- package/dist/{te-engage-NLZUPSBK.js → te-engage-F7V55KVW.js} +333 -105
- package/dist/{te-engage-E7F4HTXU.js → te-engage-FMYAYCNV.js} +333 -105
- package/dist/{te-experiment-N63WF7XA.js → te-experiment-JWXOYJ3W.js} +83 -10
- package/dist/{te-experiment-D32TB6ZB.js → te-experiment-UPDMHCAJ.js} +83 -10
- package/dist/{te-kb-E7NSCBRB.js → te-kb-VRMEY3D4.js} +6 -6
- package/dist/{te-meta-GBDTMPEL.js → te-meta-53BVXPFI.js} +7 -7
- package/dist/{te-meta-ZTLTSHXC.js → te-meta-TOCBPBXI.js} +7 -7
- package/dist/{te-system-AH7DMCAQ.js → te-system-XGS5EQIQ.js} +4 -4
- package/dist/{te-team-BQ3SKSZV.js → te-team-BZRDV2CM.js} +7 -7
- package/dist/{update-DKG6UXEM.js → update-HEDXGOJH.js} +8 -6
- package/package.json +5 -2
- package/skills/ae-agent/SKILL.md +178 -16
- package/skills/ae-agent/references/add-skill.md +22 -10
- package/skills/ae-agent/references/edit-skill.md +24 -14
- package/skills/ae-agent/references/find-archived-conversations.md +82 -0
- package/skills/ae-agent/references/restore-conversation.md +54 -0
- package/skills/ae-agent/references/upload-skill.md +24 -14
- package/skills/ae-analysis/SKILL.md +1 -1
- package/skills/ae-analysis/references/command_index.md +109 -42
- package/skills/ae-analysis/references/debug_data_list.md +28 -0
- package/skills/ae-analysis/references/debug_device_add.md +23 -0
- package/skills/ae-analysis/references/debug_device_list.md +19 -0
- package/skills/ae-analysis/references/debug_device_select.md +22 -0
- package/skills/ae-analysis/references/entity_id_import_options.md +1 -1
- package/skills/ae-analysis/references/plan_sync_display_names.md +28 -0
- package/skills/ae-analysis/references/project_access_detail_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_delete.md +3 -3
- package/skills/ae-analysis/references/project_data_power_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_list.md +3 -3
- package/skills/ae-analysis/references/project_data_power_upsert.md +3 -3
- package/skills/ae-analysis/references/project_entity_create.md +3 -3
- package/skills/ae-analysis/references/project_entity_delete.md +3 -3
- package/skills/ae-analysis/references/project_entity_event_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_get.md +3 -3
- package/skills/ae-analysis/references/project_entity_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_update.md +3 -3
- package/skills/ae-analysis/references/project_function_list.md +3 -3
- package/skills/ae-analysis/references/project_info_create.md +25 -0
- package/skills/ae-analysis/references/project_info_delete.md +24 -0
- package/skills/ae-analysis/references/project_info_get.md +3 -3
- package/skills/ae-analysis/references/project_info_list.md +3 -3
- package/skills/ae-analysis/references/project_info_update.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_create.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_delete.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_list.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_update.md +3 -3
- package/skills/ae-analysis/references/project_member_add.md +3 -3
- package/skills/ae-analysis/references/project_member_batch_update.md +3 -3
- package/skills/ae-analysis/references/project_member_candidate_list.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_export.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_run.md +3 -3
- package/skills/ae-analysis/references/project_member_import.md +3 -3
- package/skills/ae-analysis/references/project_member_list.md +3 -3
- package/skills/ae-analysis/references/project_member_receiver_list.md +3 -3
- package/skills/ae-analysis/references/project_member_remove.md +3 -3
- package/skills/ae-analysis/references/project_member_update.md +3 -3
- package/skills/ae-analysis/references/project_owner_update.md +3 -3
- package/skills/ae-analysis/references/project_permission_binding_list.md +3 -3
- package/skills/ae-analysis/references/project_receive_status_update.md +3 -3
- package/skills/ae-analysis/references/project_role_delete.md +3 -3
- package/skills/ae-analysis/references/project_role_function_list.md +3 -3
- package/skills/ae-analysis/references/project_role_get.md +3 -3
- package/skills/ae-analysis/references/project_role_list.md +3 -3
- package/skills/ae-analysis/references/project_role_upsert.md +3 -3
- package/skills/ae-analysis/references/project_role_user_list.md +3 -3
- package/skills/ae-analysis/references/project_space_list.md +1 -1
- package/skills/ae-analysis/references/project_timezone_get.md +3 -3
- package/skills/ae-analysis/references/project_timezone_overview.md +3 -3
- package/skills/ae-analysis/references/project_timezone_update.md +3 -3
- package/skills/ae-analysis/references/project_user_id_items_update.md +3 -3
- package/skills/ae-analysis/references/system_admin_function_list.md +22 -0
- package/skills/ae-analysis/references/system_admin_function_update.md +26 -0
- package/skills/ae-analysis/references/system_admin_list.md +21 -0
- package/skills/ae-analysis/references/system_admin_remove.md +25 -0
- package/skills/ae-analysis/references/system_admin_upsert.md +25 -0
- package/skills/ae-analysis/references/system_function_list.md +21 -0
- package/skills/ae-analysis/references/system_member_add.md +25 -0
- package/skills/ae-analysis/references/system_member_candidate_list.md +22 -0
- package/skills/ae-analysis/references/system_member_delete.md +25 -0
- package/skills/ae-analysis/references/system_member_list.md +24 -0
- package/skills/ae-analysis/references/system_member_mfa_unbind.md +25 -0
- package/skills/ae-analysis/references/system_member_password_reset.md +32 -0
- package/skills/ae-analysis/references/system_member_project_batch_update.md +27 -0
- package/skills/ae-analysis/references/system_member_status_update.md +26 -0
- package/skills/ae-analysis/references/system_member_update.md +23 -0
- package/skills/ae-analysis/references/system_mfa_get.md +21 -0
- package/skills/ae-analysis/references/system_mfa_update.md +25 -0
- package/skills/ae-analysis/references/system_node_monitor_list.md +24 -0
- package/skills/ae-analysis/references/system_oauth2_update.md +22 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_delete.md +25 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_list.md +23 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_test.md +29 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_upsert.md +39 -0
- package/skills/ae-analysis/references/system_preference_get.md +21 -0
- package/skills/ae-analysis/references/system_preference_update.md +22 -0
- package/skills/ae-analysis/references/system_project_usage_list.md +28 -0
- package/skills/ae-analysis/references/system_query_alert_rule_list.md +21 -0
- package/skills/ae-analysis/references/system_query_alert_rule_update.md +26 -0
- package/skills/ae-analysis/references/system_query_monitor_overview.md +26 -0
- package/skills/ae-analysis/references/system_query_task_cancel.md +25 -0
- package/skills/ae-analysis/references/system_query_task_export.md +49 -0
- package/skills/ae-analysis/references/system_query_task_get.md +23 -0
- package/skills/ae-analysis/references/system_query_task_list.md +35 -0
- package/skills/ae-analysis/references/system_query_task_options.md +27 -0
- package/skills/ae-analysis/references/system_receiver_address_delete.md +26 -0
- package/skills/ae-analysis/references/system_receiver_address_overview.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_project_list.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_promote.md +24 -0
- package/skills/ae-analysis/references/system_receiver_address_upsert.md +27 -0
- package/skills/ae-analysis/references/system_receiver_detection_get.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_run.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_update.md +25 -0
- package/skills/ae-analysis/references/system_role_delete.md +26 -0
- package/skills/ae-analysis/references/system_role_function_list.md +22 -0
- package/skills/ae-analysis/references/system_role_get.md +22 -0
- package/skills/ae-analysis/references/system_role_list.md +24 -0
- package/skills/ae-analysis/references/system_role_upsert.md +27 -0
- package/skills/ae-analysis/references/system_role_user_list.md +22 -0
- package/skills/ae-analysis/references/system_seat_list.md +25 -0
- package/skills/ae-analysis/references/system_seat_update.md +26 -0
- package/skills/ae-analysis/references/system_smtp_delete.md +24 -0
- package/skills/ae-analysis/references/system_smtp_get.md +21 -0
- package/skills/ae-analysis/references/system_smtp_test.md +22 -0
- package/skills/ae-analysis/references/system_smtp_upsert.md +31 -0
- package/skills/ae-analysis/references/system_third_party_login_disable.md +25 -0
- package/skills/ae-analysis/references/system_third_party_login_list.md +21 -0
- package/skills/ae-analysis/references/system_third_party_login_upsert.md +33 -0
- package/skills/ae-analysis/references/system_usage_overview.md +21 -0
- package/skills/ae-analysis/references/system_usage_trend_export.md +44 -0
- package/skills/ae-analysis/references/system_usage_trend_query.md +28 -0
- package/skills/ae-dataops/SKILL.md +1 -1
- package/skills/ae-dataops/references/dataops-flow-create.md +51 -16
- package/skills/ae-engage/SKILL.md +56 -26
- package/skills/ae-engage/references/activity-activity.md +3 -0
- package/skills/ae-engage/references/activity-approval.md +12 -4
- package/skills/ae-engage/references/activity-task.md +21 -6
- package/skills/ae-engage/references/activity-topic.md +31 -13
- package/skills/ae-engage/references/add-channel.md +170 -41
- package/skills/ae-engage/references/build-task-save-guide.md +40 -27
- package/skills/ae-engage/references/channel-update-config.md +3 -2
- package/skills/ae-engage/references/common-metric.md +48 -120
- package/skills/ae-engage/references/flow-detail.md +13 -0
- package/skills/ae-engage/references/preset-event.md +12 -32
- package/skills/ae-engage/references/save-flow.md +127 -64
- package/skills/ae-engage/references/save-task.md +197 -59
- package/skills/ae-engage/references/scene-config-metric.md +3 -0
- package/skills/ae-engage/references/scene-preset-metric.md +8 -37
- package/skills/ae-engage/references/scene-strategy-audience.md +51 -643
- package/skills/ae-engage/references/scene-strategy.md +6 -6
- package/skills/ae-engage/references/task-detail.md +10 -0
- package/skills/ae-engage/references/task-submit-approval.md +45 -0
- package/skills/ae-engage/references/validate-flow-node-config.md +1 -1
- package/skills/ae-experiment/SKILL.md +21 -1
- package/skills/ae-experiment/references/check_experiment_ready.md +2 -0
- package/skills/ae-experiment/references/query_experiment_detail.md +6 -0
- package/skills/ae-experiment/references/query_experiment_list.md +4 -0
- package/skills/ae-experiment/references/query_experiment_list_archived.md +3 -0
- package/skills/ae-experiment/references/query_metric_detail.md +5 -0
- package/skills/ae-experiment/references/query_metric_list.md +3 -0
- package/skills/ae-experiment/references/save_experiment.md +46 -3
- package/skills/ae-experiment/references/save_metric.md +62 -0
- package/skills/ae-experiment/references/save_submit_experiment.md +3 -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 +99 -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 +76 -0
- package/skills/ae-experiment-insight/scripts/analyze_experiment.py +478 -0
- package/skills/ae-generate-tracking-code/SKILL.md +24 -8
- package/skills/ae-generate-tracking-code/references/debug-script.md +46 -37
- package/skills/ae-generate-tracking-plan/SKILL.md +26 -1
- package/skills/ae-metadata/SKILL.md +1 -1
- package/dist/config-BSSALXEN.js +0 -128
- package/dist/sync-QFP4XFN3.js +0 -485
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Platform Operations
|
|
2
|
+
|
|
3
|
+
Read this reference before any AE/TE platform interaction.
|
|
4
|
+
|
|
5
|
+
## Hard boundary
|
|
6
|
+
|
|
7
|
+
All platform operations must use `ae-cli`. Do not call raw APIs, use browser automation, query a database, invoke te-mcp, or fabricate a platform result.
|
|
8
|
+
|
|
9
|
+
Use curated commands when their contract is known. Use the Capability Gateway for experiment capabilities that do not yet have a curated command:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
ae-cli capability search "<terms>" [--project-id <id>]
|
|
13
|
+
ae-cli capability inspect <capability-id> --project-id <id>
|
|
14
|
+
ae-cli capability validate <capability-id> --input '<json-object>'
|
|
15
|
+
ae-cli capability dry-run <capability-id> --input '<json-object>'
|
|
16
|
+
ae-cli capability run <capability-id> --input '<json-object>'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Search and inspect before constructing input. Never guess capability IDs, fields, enums, resource IDs, or project IDs. Search with the narrowest useful terms, then inspect every plausible candidate.
|
|
20
|
+
|
|
21
|
+
Use at most one normal pre-check:
|
|
22
|
+
|
|
23
|
+
- use `validate` while correcting a complex nested payload;
|
|
24
|
+
- use `dry-run` for the final request when execution impact or deletion risk must be reviewed;
|
|
25
|
+
- do not routinely stack `validate`, `dry-run`, and `run`.
|
|
26
|
+
|
|
27
|
+
## Host compatibility
|
|
28
|
+
|
|
29
|
+
After every `ae-cli` invocation, inspect stderr and `_notice.host_compat`. If a notice exists, start the user-facing result with a version warning and reproduce its update command lines verbatim. A successful envelope does not cancel the notice.
|
|
30
|
+
|
|
31
|
+
## Project gate
|
|
32
|
+
|
|
33
|
+
Resolve an unverified project through:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
ae-cli analysis project info list --query "<project name>" --fields '["project_id","project_name"]' --limit 20 --offset 0
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Reuse a project only when its ID and host were verified in the same continuous conversation. If multiple projects match, stop and ask the user to choose.
|
|
40
|
+
|
|
41
|
+
## Metadata and metric evidence
|
|
42
|
+
|
|
43
|
+
Use these curated reads when applicable:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
ae-cli analysis-meta event list --project-id <id> --query "<event>" --fields '["event_name","event_desc","authentication_status"]' --limit 20 --offset 0
|
|
47
|
+
ae-cli analysis-meta property list --project-id <id> --scope event --event-name "<event>" --limit 50 --offset 0
|
|
48
|
+
ae-cli analysis-meta property list --project-id <id> --scope user --limit 50 --offset 0
|
|
49
|
+
ae-cli analysis-meta metric list --project-id <id> --query "<metric>" --fields '["metric_id","metric_name","metric_desc","authentication_status"]' --limit 20 --offset 0
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Use `ae-cli analysis-meta metric get` after list/search when the exact metric definition is required. Use `ae-cli analysis adhoc run|export` for historical baseline and eligible-traffic evidence, following the installed `ae-analysis` command reference. Do not infer a baseline from a metric definition.
|
|
53
|
+
|
|
54
|
+
For metric creation, use the curated `ae-cli analysis-meta metric create`
|
|
55
|
+
command only after the supported event-metric definition and calculation code
|
|
56
|
+
are exact. Use `--validate` while fixing complex metric input. Do not create a
|
|
57
|
+
metric from a prose-only definition.
|
|
58
|
+
|
|
59
|
+
## Experiment capability discovery
|
|
60
|
+
|
|
61
|
+
Discover, inspect, and select capabilities for the semantic operation. Typical search concepts include:
|
|
62
|
+
|
|
63
|
+
- experiment list, get, draft save, readiness, conflict, submit, start, pause, end, delete;
|
|
64
|
+
- Feature list, get, create, update;
|
|
65
|
+
- layer or bucket list and available traffic;
|
|
66
|
+
- experiment metric report, summary, trend, sample, group, or exposure.
|
|
67
|
+
|
|
68
|
+
Catalog wording and capability IDs may differ by deployment. The inspected `input_schema`, `risk`, auth requirements, output contract, and supported dry-run behavior are authoritative.
|
|
69
|
+
|
|
70
|
+
If search returns no supported capability, report `capability gap` and continue with an offline design. Do not convert an intended platform write into raw HTTP.
|
|
71
|
+
|
|
72
|
+
## Experiment detail link
|
|
73
|
+
|
|
74
|
+
After a successful experiment save or verified exact-match reuse:
|
|
75
|
+
|
|
76
|
+
1. Read the actual `expId` from the successful `ae-cli` result; do not use a proposed input ID unless the inspected output contract confirms that the save preserved it.
|
|
77
|
+
2. Prefer a canonical detail link returned by the inspected capability output contract.
|
|
78
|
+
3. When the result contains the actual `expId` but no link, use the verified relative frontend route:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
/#/atlas/experiment/detail?expId=<actual-expId>¤tProjectId=<actual-projectId>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The user-facing response must render this as a Markdown link with a localized label. Do not put it in a code block, output it as bare text, add a `{domain}` placeholder, or construct it when either verified ID is missing.
|
|
85
|
+
|
|
86
|
+
## Risk and lifecycle policy
|
|
87
|
+
|
|
88
|
+
- `read`: execute after project and target resolution.
|
|
89
|
+
- `write`: execute when it is directly requested and inputs are exact.
|
|
90
|
+
- `high-risk-write`: dry-run the final input, summarize target and impact, wait for a later explicit confirmation, then execute unchanged input with `--yes`.
|
|
91
|
+
|
|
92
|
+
Regardless of catalog risk, require a separate explicit confirmation before submitting, starting, changing live traffic, pausing, ending, or deleting an experiment. A request to design or create a draft is not authorization to launch.
|
|
93
|
+
|
|
94
|
+
## Envelope handling
|
|
95
|
+
|
|
96
|
+
- `ok: true` with empty data is a successful empty result.
|
|
97
|
+
- `ok: true` with `meta.partial: true` is partial success; preserve `meta.failures`.
|
|
98
|
+
- `ok: false` is failure; preserve error code, message, request ID, invocation ID, stage, and failures.
|
|
99
|
+
- Do not retry an unchanged failed request.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Experiment SDK Documentation Index
|
|
2
|
+
|
|
3
|
+
Read this reference before giving exact experiment-SDK versions, dependencies, packages, imports, or API calls.
|
|
4
|
+
|
|
5
|
+
## Source policy
|
|
6
|
+
|
|
7
|
+
- Bundled references contain a concise extract for common questions.
|
|
8
|
+
- The local official Wiki is preferred for exact version-specific APIs when it contains the relevant main page.
|
|
9
|
+
- If the Wiki mirror is missing an experiment page, use the verified official source below and label the local mirror gap.
|
|
10
|
+
- Recheck document version and update date before generating production code.
|
|
11
|
+
- Do not use a page merely because a link label says it is an SDK page; verify its title and content.
|
|
12
|
+
|
|
13
|
+
## Experiment SDK matrix
|
|
14
|
+
|
|
15
|
+
Verified from the official Feishu pages on 2026-07-26:
|
|
16
|
+
|
|
17
|
+
| Platform | Experiment SDK | Analytics dependency | Remote Config dependency | Main source |
|
|
18
|
+
|---|---:|---:|---:|---|
|
|
19
|
+
| Android | `TDExperiment` 1.0.1 | `TDAnalytics` >= 3.3.6 | `TDRemoteConfig` >= 1.3.0 | `CQ83wzJjui88V1keGtNcKLxgnXb` |
|
|
20
|
+
| iOS | `TDExperiment` 1.0.2 | `ThinkingSDK` >= 3.1.6 | `TDRemoteConfig` >= 1.3.1 | `RlYIwkcvXizJeFkhp2acbWGwnFf` |
|
|
21
|
+
| JavaScript | experiment package 1.0.0 | `TDAnalytics` >= 2.6.0 | `TDRemoteconfig` >= 1.3.0 | `GlR8w2bFbiJKqUka03pcJEdnndf` |
|
|
22
|
+
|
|
23
|
+
Official source pages:
|
|
24
|
+
|
|
25
|
+
- Client SDK overview: `https://thinkingdata.feishu.cn/wiki/MCy3w6eKjihQsmkZWSQcNlrQnie`
|
|
26
|
+
- Android experiment SDK: `https://thinkingdata.feishu.cn/wiki/CQ83wzJjui88V1keGtNcKLxgnXb`
|
|
27
|
+
- iOS experiment SDK: `https://thinkingdata.feishu.cn/wiki/RlYIwkcvXizJeFkhp2acbWGwnFf`
|
|
28
|
+
- JavaScript experiment SDK: `https://thinkingdata.feishu.cn/wiki/GlR8w2bFbiJKqUka03pcJEdnndf`
|
|
29
|
+
|
|
30
|
+
## Remote Config dependency matrix
|
|
31
|
+
|
|
32
|
+
| Platform | Remote Config version | Minimum OS | Main source |
|
|
33
|
+
|---|---:|---:|---|
|
|
34
|
+
| Android | 1.3.0 | Android 4.0 / API 14 | `Lsdmwhhigi9Z3AkKs2fc9tw3nEd` |
|
|
35
|
+
| iOS | 1.3.1 | iOS 9.0 | `K85DwZetDidpMPkGHWhccKQGnUf` |
|
|
36
|
+
| JavaScript | 1.3.0 | Not stated in the verified page | `Yg3uw8RDii2WEskhz2Qc4zOanwg` |
|
|
37
|
+
|
|
38
|
+
Official source pages:
|
|
39
|
+
|
|
40
|
+
- Android Remote Config: `https://thinkingdata.feishu.cn/wiki/Lsdmwhhigi9Z3AkKs2fc9tw3nEd`
|
|
41
|
+
- iOS Remote Config: `https://thinkingdata.feishu.cn/wiki/K85DwZetDidpMPkGHWhccKQGnUf`
|
|
42
|
+
- JavaScript Remote Config: `https://thinkingdata.feishu.cn/wiki/Yg3uw8RDii2WEskhz2Qc4zOanwg`
|
|
43
|
+
|
|
44
|
+
## Local Wiki discovery
|
|
45
|
+
|
|
46
|
+
The runtime mirror is expected under:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
~/.ae-cli/wiki/te-docs/
|
|
50
|
+
├── index.md
|
|
51
|
+
├── synthesis/
|
|
52
|
+
└── raw/
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Before reading a local experiment page:
|
|
56
|
+
|
|
57
|
+
1. Check whether `index.md` exists.
|
|
58
|
+
2. Search the index and `raw/` for `experiment`, `TDExperiment`, `remote config`, `配置中心`, and `实验`.
|
|
59
|
+
3. Choose the latest main page, not a historical/versioned copy.
|
|
60
|
+
4. Read synthesis for orientation and raw for exact API details.
|
|
61
|
+
|
|
62
|
+
At the verification date, the local mirror used to build this reference did not contain experiment or Remote Config pages. Do not assume this remains true after a Wiki refresh.
|
|
63
|
+
|
|
64
|
+
## Known source conflict
|
|
65
|
+
|
|
66
|
+
The client SDK overview page labels `AvX7wAp0zix522kSy9BcBziMnJd` as the JavaScript Remote Config document, but that token currently resolves to a Data Platform Release Note. The JavaScript experiment page links to `Yg3uw8RDii2WEskhz2Qc4zOanwg`, which resolves to the verified JavaScript Remote Config 1.3.0 document.
|
|
67
|
+
|
|
68
|
+
Use `Yg3uw8RDii2WEskhz2Qc4zOanwg` until the overview page is corrected. If either page changes, verify the title, SDK version, and API content again.
|
|
69
|
+
|
|
70
|
+
## JavaScript spelling warning
|
|
71
|
+
|
|
72
|
+
The verified JavaScript experiment page spells the global object `TDExpriment`. This may be an SDK export name or a documentation typo. Copy it only after checking the downloaded package or a newer verified main document. Do not silently “correct” it to `TDExperiment`, and do not ship the documented spelling without verification.
|
|
73
|
+
|
|
74
|
+
## Unsupported exact-code cases
|
|
75
|
+
|
|
76
|
+
The supplied official pages do not establish an exact server-side experiment SDK or server evaluation API. For server or hybrid implementation, follow the architecture references and use pseudocode until `ae-cli` or verified server documentation resolves a concrete API.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Experiment SDK Knowledge and Execution Router
|
|
2
|
+
|
|
3
|
+
Read this reference only when the user explicitly asks about an A/B experiment SDK, client experiment SDK integration, experiment SDK code, or SDK troubleshooting.
|
|
4
|
+
|
|
5
|
+
Do not read or apply this reference for a normal experiment-design, Feature-design, sample-size, readiness, or draft-creation request. An experiment requiring a product change does not by itself authorize or trigger SDK work.
|
|
6
|
+
|
|
7
|
+
Examples that activate this reference:
|
|
8
|
+
|
|
9
|
+
- “How do I integrate the Android experiment SDK?”
|
|
10
|
+
- “Generate the client SDK code for this experiment.”
|
|
11
|
+
- “Why does the experiment SDK always return the default?”
|
|
12
|
+
|
|
13
|
+
Examples that do not activate it:
|
|
14
|
+
|
|
15
|
+
- “Create an experiment for a blue versus green button.”
|
|
16
|
+
- “Design the groups and traffic for this Feature.”
|
|
17
|
+
- “Create an experiment draft.”
|
|
18
|
+
|
|
19
|
+
## Four-layer architecture
|
|
20
|
+
|
|
21
|
+
Use the following layers for different jobs:
|
|
22
|
+
|
|
23
|
+
1. **Skill workflow** — `SKILL.md` enforces the explicit SDK activation gate; this reference classifies the request as knowledge, client integration, project-bound generation, or generic data integration.
|
|
24
|
+
2. **Bundled references** — concise experiment contracts, platform notes, and troubleshooting answers. Read only the files required by the request.
|
|
25
|
+
3. **Local official Wiki** — use the synced official documentation for exact packages, imports, signatures, and version-specific behavior that is not covered by references.
|
|
26
|
+
4. **Dedicated generation capability** — use an inspected `ae-cli` capability to combine a real project, Feature, experiment, and SDK type into project-bound code.
|
|
27
|
+
|
|
28
|
+
References supply knowledge. A generation capability supplies project context and execution. Do not substitute one for the other.
|
|
29
|
+
|
|
30
|
+
## Request decision
|
|
31
|
+
|
|
32
|
+
| User intent | Route |
|
|
33
|
+
|---|---|
|
|
34
|
+
| “How does automatic exposure work?” | `experiment-sdk-contract.md` + `exposure-contract.md` |
|
|
35
|
+
| “How do I initialize Android/iOS/JS experiment SDK?” | `sdk-index.md` + `client-experiment-sdk.md`; consult the local Wiki main page when exact code is required |
|
|
36
|
+
| “Should assignment happen on client or server?” | `experiment-sdk-contract.md` + the matching client/server/hybrid reference |
|
|
37
|
+
| “Why do I always get the default?” | `sdk-troubleshooting.md`, then the verified platform main document |
|
|
38
|
+
| “Generate code for this project/experiment” | `platform-operations.md` + this reference; resolve real assets and use a dedicated inspected capability |
|
|
39
|
+
| “How do I call track/user_set or configure LogBus?” | Route to `ae-data-integration-helper` |
|
|
40
|
+
|
|
41
|
+
## Documentation source order
|
|
42
|
+
|
|
43
|
+
For SDK knowledge, search in this order:
|
|
44
|
+
|
|
45
|
+
1. Read the matching bundled reference.
|
|
46
|
+
2. If `~/.ae-cli/wiki/te-docs/index.md` exists, inspect it and the most relevant document under `synthesis/`.
|
|
47
|
+
3. Read the latest main document under `~/.ae-cli/wiki/te-docs/raw/`; ignore historical or versioned pages unless the user explicitly targets that version.
|
|
48
|
+
4. If the local mirror is absent or incomplete, use the verified official online document listed in `sdk-index.md`.
|
|
49
|
+
|
|
50
|
+
You may also use:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
ae-cli tracking wiki search "experiment SDK"
|
|
54
|
+
ae-cli tracking wiki search "remote config"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Treat an empty search as a documentation gap, not proof that the product has no capability.
|
|
58
|
+
|
|
59
|
+
Do not hardcode a guessed Wiki path. Verify that an indexed local path exists before reading it. If the local page and bundled reference disagree, prefer the newer verified main document and disclose the conflict.
|
|
60
|
+
|
|
61
|
+
## Exact-code gate
|
|
62
|
+
|
|
63
|
+
Emit exact imports, packages, classes, methods, configuration keys, defaults, and version requirements only when all of the following are known:
|
|
64
|
+
|
|
65
|
+
- SDK platform and language;
|
|
66
|
+
- exact or compatible SDK version;
|
|
67
|
+
- verified main documentation;
|
|
68
|
+
- client, server, or hybrid ownership;
|
|
69
|
+
- assignment identity and Feature value type.
|
|
70
|
+
|
|
71
|
+
Otherwise provide architecture-level pseudocode and a verification checklist.
|
|
72
|
+
|
|
73
|
+
Application SDKs consume published configuration and report exposure or outcome events. They must not read or mutate AE platform configuration.
|
|
74
|
+
|
|
75
|
+
## Project-bound generation
|
|
76
|
+
|
|
77
|
+
For a request tied to a real project:
|
|
78
|
+
|
|
79
|
+
1. Resolve the project through `ae-cli`.
|
|
80
|
+
2. Resolve the exact experiment and Feature; do not accept a name-only guess.
|
|
81
|
+
3. Confirm target platforms and versions.
|
|
82
|
+
4. Search the Capability Gateway for experiment SDK sample generation.
|
|
83
|
+
5. Inspect every plausible capability and its input schema.
|
|
84
|
+
6. Validate or dry-run once when needed, then run the selected capability.
|
|
85
|
+
7. Return only artifacts and metadata present in the successful response.
|
|
86
|
+
|
|
87
|
+
Do not assume a proposed name such as `generate_experiment_sdk_sample` exists. If no dedicated capability is available, say so and provide a project-independent template with placeholders; do not call it generated project code.
|
|
88
|
+
|
|
89
|
+
## Required integration contract
|
|
90
|
+
|
|
91
|
+
Every SDK deliverable must define:
|
|
92
|
+
|
|
93
|
+
- architecture: client, server, or hybrid;
|
|
94
|
+
- initialization and dependency order;
|
|
95
|
+
- assignment identity and identity transitions;
|
|
96
|
+
- Feature key, value type, and typed default;
|
|
97
|
+
- fetch, cache, timeout, stale-value, and retry behavior;
|
|
98
|
+
- point where the assigned behavior becomes effective;
|
|
99
|
+
- automatic or manual exposure ownership;
|
|
100
|
+
- outcome event and identity join;
|
|
101
|
+
- debug/test procedure;
|
|
102
|
+
- acceptance checks.
|
|
103
|
+
|
|
104
|
+
Configuration retrieval is not exposure. Do not record exposure when the assigned behavior was never applied.
|
|
105
|
+
|
|
106
|
+
## Generic integration boundary
|
|
107
|
+
|
|
108
|
+
Do not duplicate generic SDK ingestion material here. When `ae-data-integration-helper` is bound, use it for:
|
|
109
|
+
|
|
110
|
+
- analytics SDK initialization unrelated to experiment ordering;
|
|
111
|
+
- `track`, user properties, identity APIs, and data validation;
|
|
112
|
+
- upload failures, LogBus, REST, and collection logs.
|
|
113
|
+
|
|
114
|
+
If it is not bound, answer the experiment-specific portion and state that the generic integration dependency is unavailable.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Experiment SDK Troubleshooting
|
|
2
|
+
|
|
3
|
+
Read this reference for retrieval, default, assignment, exposure, cache, or debug problems. Resolve the exact project and Feature through `ae-cli` when the diagnosis depends on platform state.
|
|
4
|
+
|
|
5
|
+
## Collect first
|
|
6
|
+
|
|
7
|
+
Ask only for missing facts:
|
|
8
|
+
|
|
9
|
+
- platform and SDK versions;
|
|
10
|
+
- app ID and environment, without requesting secrets;
|
|
11
|
+
- Feature key and expected type;
|
|
12
|
+
- assignment identity before and after login;
|
|
13
|
+
- automatic or manual exposure mode;
|
|
14
|
+
- fetch callback or full error;
|
|
15
|
+
- whether the value was fetched, applied, and exposed;
|
|
16
|
+
- whether the issue affects all users, one test user, or one group.
|
|
17
|
+
|
|
18
|
+
## Symptom routing
|
|
19
|
+
|
|
20
|
+
### Always receives the default
|
|
21
|
+
|
|
22
|
+
Check in order:
|
|
23
|
+
|
|
24
|
+
1. analytics initialized before experiment SDK;
|
|
25
|
+
2. experiment, analytics, and Remote Config versions meet `sdk-index.md`;
|
|
26
|
+
3. app ID and server environment match the target experiment;
|
|
27
|
+
4. startup or explicit fetch succeeded;
|
|
28
|
+
5. Feature key and getter type match the platform Feature;
|
|
29
|
+
6. assignment identity is established before evaluation;
|
|
30
|
+
7. targeting and experiment traffic include the test identity;
|
|
31
|
+
8. custom bucket and custom fetch parameters match the verified contract;
|
|
32
|
+
9. cached or local default is not masking a remote miss.
|
|
33
|
+
|
|
34
|
+
Do not treat a successful SDK initialization as proof that a Feature value was fetched.
|
|
35
|
+
|
|
36
|
+
### Value changes unexpectedly
|
|
37
|
+
|
|
38
|
+
Check:
|
|
39
|
+
|
|
40
|
+
- identity transition after login;
|
|
41
|
+
- account or role switching;
|
|
42
|
+
- mid-session fetch;
|
|
43
|
+
- cache isolation by identity and environment;
|
|
44
|
+
- platform configuration changes;
|
|
45
|
+
- client and server evaluating independently;
|
|
46
|
+
- stale value replacement policy.
|
|
47
|
+
|
|
48
|
+
Freeze the value at the intended decision boundary when mid-session changes are not part of the product design.
|
|
49
|
+
|
|
50
|
+
### No exposure
|
|
51
|
+
|
|
52
|
+
Check:
|
|
53
|
+
|
|
54
|
+
- `automaticExposureTracking` is enabled when automatic mode is intended;
|
|
55
|
+
- the typed getter was actually called;
|
|
56
|
+
- the assigned behavior was applied;
|
|
57
|
+
- manual mode calls the platform’s verified exposure operation at activation;
|
|
58
|
+
- analytics upload and identity are healthy through `ae-data-integration-helper`;
|
|
59
|
+
- the exposure/report window has completed.
|
|
60
|
+
|
|
61
|
+
### Duplicate exposure
|
|
62
|
+
|
|
63
|
+
Check:
|
|
64
|
+
|
|
65
|
+
- automatic and manual modes are not both active;
|
|
66
|
+
- render loops or repeated getters;
|
|
67
|
+
- retries without an application deduplication scope;
|
|
68
|
+
- client and server both reporting;
|
|
69
|
+
- route changes or component remounts;
|
|
70
|
+
- account switching.
|
|
71
|
+
|
|
72
|
+
### Wrong group or cross-platform mismatch
|
|
73
|
+
|
|
74
|
+
Check:
|
|
75
|
+
|
|
76
|
+
- custom bucket ID values on every platform;
|
|
77
|
+
- pre-login and post-login identifiers;
|
|
78
|
+
- string normalization and missing values;
|
|
79
|
+
- project and environment;
|
|
80
|
+
- client/server cache keys;
|
|
81
|
+
- experiment traffic and targeting;
|
|
82
|
+
- whether one side falls back to control while the other evaluates treatment.
|
|
83
|
+
|
|
84
|
+
## Fetch and callback checks
|
|
85
|
+
|
|
86
|
+
Verified client pages provide:
|
|
87
|
+
|
|
88
|
+
- startup fetch success/failure callbacks;
|
|
89
|
+
- explicit `fetch`;
|
|
90
|
+
- custom fetch parameters;
|
|
91
|
+
- experiment logging.
|
|
92
|
+
|
|
93
|
+
Capture the exact callback code and message. Do not retry an unchanged invalid request. Separate transport failure, configuration absence, targeting exclusion, type mismatch, and control assignment.
|
|
94
|
+
|
|
95
|
+
## Defaults and Remote Config
|
|
96
|
+
|
|
97
|
+
Verified Remote Config pages define:
|
|
98
|
+
|
|
99
|
+
1. remote value;
|
|
100
|
+
2. local default;
|
|
101
|
+
3. empty when neither exists.
|
|
102
|
+
|
|
103
|
+
For experiment behavior, also keep an application-owned typed control default. Confirm which layer produced the observed value.
|
|
104
|
+
|
|
105
|
+
## Debug and test mode
|
|
106
|
+
|
|
107
|
+
The verified Remote Config pages state that client debug mode pulls test strategies every five seconds and requires a selected or added test device. This is a test-mode Remote Config behavior, not a production experiment polling guarantee.
|
|
108
|
+
|
|
109
|
+
Platform notes:
|
|
110
|
+
|
|
111
|
+
- Android Remote Config uses debug mode in `TDSettings`.
|
|
112
|
+
- iOS Remote Config uses `TDSDKModeDebug` and can enable logs.
|
|
113
|
+
- JavaScript Remote Config uses `mode: "debug"` and `enableLog`.
|
|
114
|
+
- Experiment SDK pages expose experiment logging separately.
|
|
115
|
+
|
|
116
|
+
Disable or production-harden debug behavior before release.
|
|
117
|
+
|
|
118
|
+
## Generic SDK problems
|
|
119
|
+
|
|
120
|
+
Route these to `ae-data-integration-helper` when available:
|
|
121
|
+
|
|
122
|
+
- analytics event upload failure;
|
|
123
|
+
- user identity API usage;
|
|
124
|
+
- `track` or user-property syntax;
|
|
125
|
+
- data delay and ingestion validation;
|
|
126
|
+
- LogBus, REST, or collection logs.
|
|
127
|
+
|
|
128
|
+
Keep the experiment diagnosis focused on assignment, Feature retrieval, defaults, activation, and exposure.
|
|
129
|
+
|
|
130
|
+
## Diagnostic output
|
|
131
|
+
|
|
132
|
+
Return:
|
|
133
|
+
|
|
134
|
+
- observed evidence;
|
|
135
|
+
- likely stage of failure;
|
|
136
|
+
- competing explanation;
|
|
137
|
+
- exact next `ae-cli` or product check;
|
|
138
|
+
- remediation if confirmed;
|
|
139
|
+
- unresolved documentation or capability gap.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Server Experiment Architecture
|
|
2
|
+
|
|
3
|
+
Read this reference when assignment, Feature evaluation, or behavior execution belongs on a backend service.
|
|
4
|
+
|
|
5
|
+
## Evidence boundary
|
|
6
|
+
|
|
7
|
+
The verified client documentation does not establish an exact AE server experiment SDK, package, endpoint, or method. Do not invent one.
|
|
8
|
+
|
|
9
|
+
Before exact implementation:
|
|
10
|
+
|
|
11
|
+
1. Resolve the real project, experiment, Feature, and assignment unit with `ae-cli`.
|
|
12
|
+
2. Search and inspect the Capability Gateway for server experiment evaluation or SDK generation.
|
|
13
|
+
3. Read verified server documentation if returned by the platform or provided by the user.
|
|
14
|
+
4. Use architecture-level pseudocode until the API contract is verified.
|
|
15
|
+
|
|
16
|
+
## Recommended server contract
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
evaluateExperiment(
|
|
20
|
+
project,
|
|
21
|
+
featureKey,
|
|
22
|
+
stableAssignmentId,
|
|
23
|
+
context
|
|
24
|
+
) -> {
|
|
25
|
+
value,
|
|
26
|
+
valueType,
|
|
27
|
+
assignmentOrGroupId,
|
|
28
|
+
configVersion,
|
|
29
|
+
source,
|
|
30
|
+
evaluatedAt
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The field names above describe an application contract, not a verified AE API schema.
|
|
35
|
+
|
|
36
|
+
## Server responsibilities
|
|
37
|
+
|
|
38
|
+
- derive a stable assignment ID before evaluation;
|
|
39
|
+
- evaluate once per request, session, or product-defined decision boundary;
|
|
40
|
+
- apply a typed control default on timeout or unavailable configuration;
|
|
41
|
+
- preserve assignment consistency across replicas and regions;
|
|
42
|
+
- prevent cache keys from mixing projects, environments, Features, or identities;
|
|
43
|
+
- expose enough internal metadata to diagnose assignment without leaking it to end users;
|
|
44
|
+
- emit or authorize exposure only when treatment becomes effective;
|
|
45
|
+
- report outcomes with a joinable identity.
|
|
46
|
+
|
|
47
|
+
## Cache policy
|
|
48
|
+
|
|
49
|
+
Define separately:
|
|
50
|
+
|
|
51
|
+
- configuration cache;
|
|
52
|
+
- per-identity assignment cache;
|
|
53
|
+
- response or page cache.
|
|
54
|
+
|
|
55
|
+
Do not cache a personalized treatment under a shared response key. Include environment, project, Feature key, and assignment identity in any evaluation cache key unless the verified SDK guarantees safe internal caching.
|
|
56
|
+
|
|
57
|
+
## Failure policy
|
|
58
|
+
|
|
59
|
+
- timeout or transport failure: use typed control default;
|
|
60
|
+
- invalid value type: reject the value and use control;
|
|
61
|
+
- unknown Feature: fail closed to control and alert;
|
|
62
|
+
- stale configuration: use only within the approved stale window;
|
|
63
|
+
- identity missing: either use a documented anonymous assignment or control; never generate a new unstable ID per request.
|
|
64
|
+
|
|
65
|
+
## Exposure ownership
|
|
66
|
+
|
|
67
|
+
If the server fully executes the behavior, server exposure may be appropriate. If the server only sends a variant and the client decides whether it is rendered, client exposure is usually the truthful point.
|
|
68
|
+
|
|
69
|
+
Choose one owner and read `exposure-contract.md`.
|
|
70
|
+
|
|
71
|
+
## Verification checklist
|
|
72
|
+
|
|
73
|
+
- Same identity returns a stable value across replicas.
|
|
74
|
+
- Control fallback is safe and typed.
|
|
75
|
+
- Cache isolation prevents cross-user treatment leakage.
|
|
76
|
+
- Exposure reflects effective behavior, not evaluation alone.
|
|
77
|
+
- Client and server do not both report the same exposure.
|
|
78
|
+
- Outcome identity joins to assignment and exposure.
|