service-de-channel-consent-configure

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Configuring Channel Consent

配置渠道同意机制

What this skill does

此功能的作用

Ensures an Enhanced
MessagingChannel
has valid consent configured before activation. Consent has two parts, and both are checked by the server-side activation-readiness gate (
MessagingChannelReadinessChecker.isConsentConfiguredForChannel
):
  1. Channel-level fields on
    MessagingChannel
    :
    • ConsentType
      — static enum:
      ImplicitOptIn
      ,
      ExplicitOptIn
      , or
      DoubleOptIn
      .
    • OptInPrompt
      — message sent when an end-user reply doesn't match an opt-in keyword (required for ExplicitOptIn/DoubleOptIn, except on Unified SMS / WhatsApp / RCS where it's optional).
    • DoubleOptInPrompt
      — message sent when a reply doesn't match a double-opt-in keyword (required for DoubleOptIn).
    • IsRequireDoubleOptIn
      — boolean flag; set true alongside
      ConsentType=DoubleOptIn
      .
  2. Per-language keyword records — one or more
    MsgChannelLanguageKeyword
    child rows (master-detail to
    MessagingChannel
    , key prefix
    3Or
    ). Each holds the keywords an end-user sends (opt-in, double-opt-in, opt-out, help, custom) and the confirmation replies, for one language. Keyword fields are comma-separated strings (e.g.
    "STOP,UNSUBSCRIBE,CANCEL"
    ).
Consent is never a no-op for activation. Even
ImplicitOptIn
requires at least one
MsgChannelLanguageKeyword
with an opt-out keyword + opt-out confirmation. (The one exception is an outbound-only channel, which the readiness check passes automatically.)
Consent settings apply only to Enhanced channels (
PlatformType=Enhanced
) of a supported message type. On a Standard channel these fields aren't used; this skill only touches Enhanced channels.
确保增强型
MessagingChannel
在激活前已配置有效的同意机制。同意机制包含两部分内容,服务器端的激活就绪校验(
MessagingChannelReadinessChecker.isConsentConfiguredForChannel
)会对这两部分进行检查:
  1. MessagingChannel
    的渠道级字段
    • ConsentType
      ——静态枚举值:
      ImplicitOptIn
      ExplicitOptIn
      DoubleOptIn
    • OptInPrompt
      ——当终端用户回复与选择加入关键词不匹配时发送的消息(ExplicitOptIn/DoubleOptIn类型必填,但在Unified SMS/WhatsApp/RCS渠道中为可选)。
    • DoubleOptInPrompt
      ——当回复与双向确认加入关键词不匹配时发送的消息(DoubleOptIn类型必填)。
    • IsRequireDoubleOptIn
      ——布尔标志;需与
      ConsentType=DoubleOptIn
      同时设为true。
  2. 按语言划分的关键词记录——一条或多条
    MsgChannelLanguageKeyword
    子记录(与
    MessagingChannel
    为主从关系,键前缀为
    3Or
    )。每条记录对应一种语言,存储终端用户发送的关键词(选择加入、双向确认加入、选择退出、帮助、自定义)及确认回复。关键词字段为逗号分隔的字符串(例如
    "STOP,UNSUBSCRIBE,CANCEL"
    )。
同意机制对激活而言并非可有可无。即使是
ImplicitOptIn
类型,也至少需要一条包含选择退出关键词+选择退出确认消息的
MsgChannelLanguageKeyword
记录。(唯一例外是仅 outbound 的渠道,此类渠道会自动通过就绪检查。)
同意设置仅适用于支持消息类型的增强型渠道(
PlatformType=Enhanced
)。标准渠道不会使用这些字段;此功能仅针对增强型渠道生效。

Where this fits

适用场景

This skill runs between routing and activation in the Enhanced-channel setup pipeline.
service-de-channel-routing-configure
sets the channel's
SessionHandler
; this skill configures consent; then
service-de-channel-activate
flips the channel live. The activation readiness check requires both routing and consent, so run this before activating. The
service-de-headless-channel-configure
orchestrator sequences all three automatically — invoke this skill directly only when you want to configure consent on its own.
此功能在增强型渠道设置流程中的路由配置与激活步骤之间运行。
service-de-channel-routing-configure
负责设置渠道的
SessionHandler
;此功能负责配置同意机制;随后
service-de-channel-activate
将渠道正式启用。激活就绪检查要求同时完成路由与同意配置,因此请在激活前运行此功能。
service-de-headless-channel-configure
编排器会自动按顺序执行这三个步骤——仅当您需要单独配置同意机制时,才直接调用此功能。

Reference File Index

参考文件索引

Reference fileLoad when
references/language-keywords.md
Creating or updating the per-language
MsgChannelLanguageKeyword
records — full field list, CSV keyword semantics, create-vs-update logic, and the Unified-SMS help/custom-keyword rules.
references/gotchas.md
Troubleshooting an unexpected result, or before modifying this skill.
references/worked-examples.md
You want a reference run of the ImplicitOptIn, ExplicitOptIn, or DoubleOptIn paths.
参考文件加载时机
references/language-keywords.md
创建或更新按语言划分的
MsgChannelLanguageKeyword
记录时——包含完整字段列表、CSV关键词语义、创建/更新逻辑,以及Unified SMS帮助/自定义关键词规则。
references/gotchas.md
排查异常结果或修改此功能之前。
references/worked-examples.md
需要参考ImplicitOptIn、ExplicitOptIn或DoubleOptIn流程的运行示例时。

When NOT to use this skill

不适用场景

  • The channel isn't Enhanced. Consent fields apply to Enhanced channels only. This skill confirms
    PlatformType=Enhanced
    and stops otherwise.
  • The channel is outbound-only. Outbound-only channels pass the consent-readiness check automatically; there's nothing to configure.
  • The channel doesn't exist yet. Run the insertion skill first; this skill expects a real
    MessagingChannel.Id
    .
  • 渠道非增强型:同意字段仅适用于增强型渠道。此功能会先确认
    PlatformType=Enhanced
    ,否则将停止运行。
  • 渠道仅支持 outbound:仅outbound的渠道会自动通过同意就绪检查,无需进行任何配置。
  • 渠道尚未创建:请先运行渠道创建功能;此功能需要已存在的
    MessagingChannel.Id

Inputs (from caller)

调用方输入参数

  • {CHANNEL_ID}
    — a 15- or 18-char
    MessagingChannel.Id
    (prefix
    0Mj
    ). Must already exist and be Enhanced.
  • {CONSENT_TYPE}
    — optional; one of
    ImplicitOptIn
    |
    ExplicitOptIn
    |
    DoubleOptIn
    . If omitted, the skill prompts.
  • {LANGUAGE}
    — optional; the
    MasterLanguage
    for the keyword record (e.g.
    en_US
    ). Defaults to
    en_US
    if not provided.
  • {ORG_ALIAS}
    — optional;
    sf
    CLI target-org alias. Default: whatever
    sf config get target-org
    returns.
The individual keyword/confirmation/prompt values are collected interactively in Stage 3–4 (or accepted from the caller if pre-supplied).
  • {CHANNEL_ID}
    ——15或18位字符的
    MessagingChannel.Id
    (前缀为
    0Mj
    )。必须已存在且为增强型渠道。
  • {CONSENT_TYPE}
    ——可选;取值为
    ImplicitOptIn
    |
    ExplicitOptIn
    |
    DoubleOptIn
    。若未提供,此功能将发起提示。
  • {LANGUAGE}
    ——可选;关键词记录的
    MasterLanguage
    (例如
    en_US
    )。未提供时默认值为
    en_US
  • {ORG_ALIAS}
    ——可选;sf CLI的目标组织别名。默认值:
    sf config get target-org
    返回的结果。
具体的关键词/确认消息/提示值会在第3-4阶段交互式收集(若调用方预先提供则直接使用)。

Output (to caller)

返回给调用方的结果

Success — no change needed:
json
{"ok": true, "noop": true, "consentType": "ImplicitOptIn|ExplicitOptIn|DoubleOptIn", "languageKeywordIds": ["3Or..."], "message": "Consent already configured and activation-ready"}
Success — consent configured:
json
{"ok": true, "consentType": "ExplicitOptIn", "channelFieldsSet": ["ConsentType","OptInPrompt"],
 "languageKeywordId": "3Or...", "language": "en_US", "created": true|false, "activationReady": true}
Precondition / validation not met:
json
{"ok": false, "kind": "not-enhanced", "hint": "consent fields apply to Enhanced channels only; this channel is PlatformType=<x>"}
{"ok": false, "kind": "missing-consent-input", "hint": "<which required keyword/prompt for the chosen ConsentType is missing>"}
Failure:
json
{"ok": false, "kind": "channel-patch-failed", "message": "..."}
{"ok": false, "kind": "keyword-record-failed", "message": "..."}
{"ok": false, "kind": "verify-failed", "hint": "writes returned success but a re-read shows the channel is still not consent-ready"}

成功——无需修改:
json
{"ok": true, "noop": true, "consentType": "ImplicitOptIn|ExplicitOptIn|DoubleOptIn", "languageKeywordIds": ["3Or..."], "message": "Consent already configured and activation-ready"}
成功——同意机制已配置:
json
{"ok": true, "consentType": "ExplicitOptIn", "channelFieldsSet": ["ConsentType","OptInPrompt"],
 "languageKeywordId": "3Or...", "language": "en_US", "created": true|false, "activationReady": true}
前置条件/校验未通过:
json
{"ok": false, "kind": "not-enhanced", "hint": "consent fields apply to Enhanced channels only; this channel is PlatformType=<x>"}
{"ok": false, "kind": "missing-consent-input", "hint": "<which required keyword/prompt for the chosen ConsentType is missing>"}
失败:
json
{"ok": false, "kind": "channel-patch-failed", "message": "..."}
{"ok": false, "kind": "keyword-record-failed", "message": "..."}
{"ok": false, "kind": "verify-failed", "hint": "writes returned success but a re-read shows the channel is still not consent-ready"}

Stage 1: Read current consent state

阶段1:读取当前同意状态

Read the channel's consent fields and any existing language-keyword records.
bash
sf data query --target-org '{ORG_ALIAS}' \
  --query "SELECT Id, DeveloperName, PlatformType, MessageType, MessagingPlatformKey, ConsentType, OptInPrompt, DoubleOptInPrompt, IsRequireDoubleOptIn FROM MessagingChannel WHERE Id = '{CHANNEL_ID}'" \
  --json > /tmp/cc-channel.json

sf data query --target-org '{ORG_ALIAS}' \
  --query "SELECT Id, MasterLanguage, OptInKeywords, DoubleOptInKeywords, OptInConfirmation, OptOutKeywords, OptOutConfirmation, HelpKeywords, HelpResponse, CustomKeywords, CustomResponse FROM MsgChannelLanguageKeyword WHERE MessagingChannelId = '{CHANNEL_ID}'" \
  --json > /tmp/cc-keywords.json
If the channel record is missing — halt with
Error: Channel {CHANNEL_ID} not found — check the id, or run the insertion skill first.
If
PlatformType != 'Enhanced'
— emit
{ok:false, kind:"not-enhanced", ...}
and stop.
No-op check: if
ConsentType
is non-null AND the existing language-keyword records already satisfy the readiness matrix for that ConsentType (see Stage 5), emit the
noop:true
envelope and return. Don't re-prompt or overwrite a channel that is already activation-ready.

读取渠道的同意字段及已有的语言关键词记录。
bash
sf data query --target-org '{ORG_ALIAS}' \
  --query "SELECT Id, DeveloperName, PlatformType, MessageType, MessagingPlatformKey, ConsentType, OptInPrompt, DoubleOptInPrompt, IsRequireDoubleOptIn FROM MessagingChannel WHERE Id = '{CHANNEL_ID}'" \
  --json > /tmp/cc-channel.json

sf data query --target-org '{ORG_ALIAS}' \
  --query "SELECT Id, MasterLanguage, OptInKeywords, DoubleOptInKeywords, OptInConfirmation, OptOutKeywords, OptOutConfirmation, HelpKeywords, HelpResponse, CustomKeywords, CustomResponse FROM MsgChannelLanguageKeyword WHERE MessagingChannelId = '{CHANNEL_ID}'" \
  --json > /tmp/cc-keywords.json
若渠道记录不存在——终止并提示
Error: Channel {CHANNEL_ID} not found — check the id, or run the insertion skill first.
PlatformType != 'Enhanced'
——返回
{ok:false, kind:"not-enhanced", ...}
并停止运行。
**无需操作校验:**若
ConsentType
非空,且现有语言关键词记录已满足该ConsentType对应的就绪矩阵要求(见阶段5),则返回
noop:true
的结果包并结束。请勿重新提示或覆盖已准备好激活的渠道。

Stage 2: Choose the ConsentType

阶段2:选择ConsentType

If
{CONSENT_TYPE}
wasn't supplied, prompt (do NOT auto-pick):
text
Channel '{developerName}' ({CHANNEL_ID}) — choose a consent model:

  1) ImplicitOptIn  — end users are opted in by default; you only handle opt-OUT (STOP) keywords.
  2) ExplicitOptIn  — end users must send an opt-in keyword before you can message them.
  3) DoubleOptIn    — explicit opt-in plus a second confirming keyword.

Pick [1-3]:
Record
{CONSENT_TYPE}
. Note the field checks that follow (this is the exact server-side activation-readiness contract — see
references/gotchas.md
for the source):
ConsentTypeMessagingChannel fields
MsgChannelLanguageKeyword
(≥1 record)
ImplicitOptIn(none required)
OptOutKeywords
+
OptOutConfirmation
ExplicitOptIn
OptInPrompt
¹
above +
OptInKeywords
DoubleOptIn
OptInPrompt
¹ +
DoubleOptInPrompt
+
IsRequireDoubleOptIn=true
above +
DoubleOptInKeywords
¹
OptInPrompt
is optional (not required for readiness) on Unified SMS / WhatsApp / RCS channels — detect via
MessageType IN ('Text','WhatsApp','Rcs')
on an Enhanced channel (the queryable proxy for the server's
isUnifiedSMSOrWhatsappOrRCS
). Still recommend setting it for a good end-user experience.

若未提供
{CONSENT_TYPE}
,则发起提示(请勿自动选择):
text
Channel '{developerName}' ({CHANNEL_ID}) — choose a consent model:

  1) ImplicitOptIn  — end users are opted in by default; you only handle opt-OUT (STOP) keywords.
  2) ExplicitOptIn  — end users must send an opt-in keyword before you can message them.
  3) DoubleOptIn    — explicit opt-in plus a second confirming keyword.

Pick [1-3]:
记录
{CONSENT_TYPE}
。请注意后续的字段检查规则(这与服务器端激活就绪校验的规则完全一致——规则来源见
references/gotchas.md
):
ConsentTypeMessagingChannel字段要求
MsgChannelLanguageKeyword
(≥1条记录)要求
ImplicitOptIn无必填字段
OptOutKeywords
+
OptOutConfirmation
ExplicitOptIn
OptInPrompt
¹
上述要求 +
OptInKeywords
DoubleOptIn
OptInPrompt
¹ +
DoubleOptInPrompt
+
IsRequireDoubleOptIn=true
上述要求 +
DoubleOptInKeywords
¹ 在Unified SMS/WhatsApp/RCS渠道中,
OptInPrompt
为可选(就绪校验不要求)——可通过增强型渠道的
MessageType IN ('Text','WhatsApp','Rcs')
来判断(这是服务器端
isUnifiedSMSOrWhatsappOrRCS
的可查询代理)。但为了良好的用户体验,仍建议设置该字段。

Stage 3: Collect channel-level prompt values

阶段3:收集渠道级提示值

Only prompt for the fields the chosen ConsentType requires (see the matrix above). Skip this stage entirely for
ImplicitOptIn
— it needs no channel-level prompt fields.
For
ExplicitOptIn
/
DoubleOptIn
:
text
Opt-in prompt (sent when a reply doesn't match an opt-in keyword):
For
DoubleOptIn
, also:
text
Double-opt-in prompt (sent when a reply doesn't match a double-opt-in keyword):
Trim whitespace. If a required prompt is empty after trimming, re-prompt once; on a second empty, emit
{ok:false, kind:"missing-consent-input", hint:"..."}
.

仅提示所选ConsentType要求的字段(见上述矩阵)。对于
ImplicitOptIn
类型,可完全跳过此阶段——它不需要任何渠道级提示字段。
对于
ExplicitOptIn
/
DoubleOptIn
类型:
text
Opt-in prompt (sent when a reply doesn't match an opt-in keyword):
对于
DoubleOptIn
类型,还需提示:
text
Double-opt-in prompt (sent when a reply doesn't match a double-opt-in keyword):
去除首尾空格。若必填提示去除空格后为空,重新提示一次;若第二次仍为空,返回
{ok:false, kind:"missing-consent-input", hint:"..."}

Stage 4: Configure the per-language keyword record

阶段4:配置按语言划分的关键词记录

Collect the keyword lists and confirmation replies for
{LANGUAGE}
(default
en_US
), then create or update the
MsgChannelLanguageKeyword
record.
Load
references/language-keywords.md
and follow it
— it holds the full field list, the comma-separated-keyword semantics, the create-vs-update decision (reuse an existing record for the same language rather than duplicating), and the Unified-SMS help/custom-keyword rules.
The minimum per ConsentType (again, from the readiness contract):
  • ImplicitOptIn:
    OptOutKeywords
    (e.g.
    STOP,UNSUBSCRIBE
    ) +
    OptOutConfirmation
    .
  • ExplicitOptIn: the above +
    OptInKeywords
    (e.g.
    START,YES
    ).
  • DoubleOptIn: the above +
    DoubleOptInKeywords
    (e.g.
    CONFIRM
    ).
OptInConfirmation
,
HelpKeywords
/
HelpResponse
, and
CustomKeywords
/
CustomResponse
are optional for the base readiness check (help/custom are only required on Unified SMS — see the reference), but collect them if the user wants them.

收集
{LANGUAGE}
(默认
en_US
)对应的关键词列表及确认回复,然后创建或更新
MsgChannelLanguageKeyword
记录。
请加载并遵循
references/language-keywords.md
中的规则
——其中包含完整字段列表、逗号分隔关键词的语义、创建/更新决策逻辑(复用同语言的现有记录而非重复创建),以及Unified SMS帮助/自定义关键词规则。
各ConsentType的最低要求(同样来自就绪校验规则):
  • ImplicitOptIn
    OptOutKeywords
    (例如
    STOP,UNSUBSCRIBE
    ) +
    OptOutConfirmation
  • ExplicitOptIn:上述要求 +
    OptInKeywords
    (例如
    START,YES
    )。
  • DoubleOptIn:上述要求 +
    DoubleOptInKeywords
    (例如
    CONFIRM
    )。
OptInConfirmation
HelpKeywords
/
HelpResponse
CustomKeywords
/
CustomResponse
在基础就绪校验中为可选(仅Unified SMS渠道要求帮助/自定义关键词——见参考文件),但如果用户需要,可收集这些信息。

Stage 5: Write channel fields + keyword record

阶段5:写入渠道字段 + 关键词记录

Write the channel-level fields in one PATCH (only the fields the ConsentType requires).
Quoting rule (load-bearing):
sf data update record --values
splits on spaces, so any value containing a space must be wrapped in single quotes inside the double-quoted
--values
string
— e.g.
OptInPrompt='Reply YES to receive messages'
. An unquoted
OptInPrompt=Reply YES ...
fails with
Malformed key=value pair
(verified live on sdb6c). Prompts almost always contain spaces, so always quote them.
bash
undefined
通过一次PATCH操作写入渠道级字段(仅写入所选ConsentType要求的字段)。
引号规则(关键):
sf data update record --values
会按空格拆分内容,因此任何包含空格的值必须在双引号包裹的
--values
字符串内再用单引号包裹
——例如
OptInPrompt='Reply YES to receive messages'
。未加单引号的
OptInPrompt=Reply YES ...
会因
Malformed key=value pair
报错(已在sdb6c环境验证)。提示消息几乎都包含空格,因此务必添加单引号。
bash
undefined

ImplicitOptIn — ConsentType only

ImplicitOptIn — 仅设置ConsentType

sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}' --values "ConsentType=ImplicitOptIn" --json > /tmp/cc-patch.json
sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}' --values "ConsentType=ImplicitOptIn" --json > /tmp/cc-patch.json

ExplicitOptIn

ExplicitOptIn

sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}' --values "ConsentType=ExplicitOptIn OptInPrompt='{OPT_IN_PROMPT}'" --json > /tmp/cc-patch.json
sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}' --values "ConsentType=ExplicitOptIn OptInPrompt='{OPT_IN_PROMPT}'" --json > /tmp/cc-patch.json

DoubleOptIn

DoubleOptIn

sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}'
--values "ConsentType=DoubleOptIn OptInPrompt='{OPT_IN_PROMPT}' DoubleOptInPrompt='{DBL_PROMPT}' IsRequireDoubleOptIn=true" --json > /tmp/cc-patch.json

If `status !== 0`: emit `{ok:false, kind:"channel-patch-failed", message: ...}` and return.

Then create or update the `MsgChannelLanguageKeyword` record per `references/language-keywords.md`. If it fails: `{ok:false, kind:"keyword-record-failed", message: ...}`.

---
sf data update record --target-org '{ORG_ALIAS}' --sobject MessagingChannel
--record-id '{CHANNEL_ID}'
--values "ConsentType=DoubleOptIn OptInPrompt='{OPT_IN_PROMPT}' DoubleOptInPrompt='{DBL_PROMPT}' IsRequireDoubleOptIn=true" --json > /tmp/cc-patch.json

若`status !== 0`:返回`{ok:false, kind:"channel-patch-failed", message: ...}`并结束。

然后根据`references/language-keywords.md`创建或更新`MsgChannelLanguageKeyword`记录。若操作失败:返回`{ok:false, kind:"keyword-record-failed", message: ...}`。

---

Stage 6: Verify activation readiness

阶段6:验证激活就绪状态

Re-read both the channel and its keyword records (same two queries as Stage 1). Confirm, per the chosen ConsentType's row in the Stage 2 matrix, that every required field is now non-null on the channel AND on at least one keyword record for the configured language.
If any required field is still null: emit
{ok:false, kind:"verify-failed", hint:"<which requirement is unmet>"}
.
Otherwise emit the success envelope with
activationReady: true
.

重新读取渠道及其关键词记录(使用与阶段1相同的两个查询)。根据阶段2矩阵中所选ConsentType对应的行,确认渠道上的所有必填字段均已非空,且至少一条对应语言的关键词记录上的所有必填字段也已非空。
若任何必填字段仍为空:返回
{ok:false, kind:"verify-failed", hint:"<which requirement is unmet>"}
否则返回包含
activationReady: true
的成功结果包。

Stage 7: Report to caller

阶段7:向调用方报告结果

Report the JSON envelope. If this skill is the leaf (user invoked it directly), render:
  • Success — Consent configured — channel {CHANNEL_ID} is now {CONSENT_TYPE} with a {LANGUAGE} keyword record. Activation-ready.
  • Info: Consent already configured — {CONSENT_TYPE}, {N} language record(s). No changes.
    (no-op path)
  • Warning: This channel is PlatformType={x}, not Enhanced — consent fields don't apply here.
    (not-enhanced)
  • Warning: Missing required consent input for {CONSENT_TYPE}: {what}. Re-run and provide it.
    (missing-consent-input)
  • Error: {kind}: {message}
    (other failures)

返回JSON结果包。若此功能为直接被用户调用的终端功能,则显示:
  • Success — Consent configured — channel {CHANNEL_ID} is now {CONSENT_TYPE} with a {LANGUAGE} keyword record. Activation-ready.
  • Info: Consent already configured — {CONSENT_TYPE}, {N} language record(s). No changes.
    (无需操作场景)
  • Warning: This channel is PlatformType={x}, not Enhanced — consent fields don't apply here.
    (非增强型渠道场景)
  • Warning: Missing required consent input for {CONSENT_TYPE}: {what}. Re-run and provide it.
    (缺少必填输入场景)
  • Error: {kind}: {message}
    (其他失败场景)

Worked examples

运行示例

For reference runs of the ImplicitOptIn (opt-out only), ExplicitOptIn, and DoubleOptIn paths, see
references/worked-examples.md
.

如需参考ImplicitOptIn(仅选择退出)、ExplicitOptIn和DoubleOptIn流程的运行示例,请查看
references/worked-examples.md

Gotchas

注意事项

Known gotchas — the exact per-ConsentType activation-readiness contract (and its source), comma-separated keyword storage, the "ImplicitOptIn still needs a keyword record" trap, one-record-per-language uniqueness, the Unified-SMS help/French-custom rules, and the OptInPrompt Unified-SMS/WhatsApp/RCS exemption.
When troubleshooting an unexpected result, or before modifying this skill, load
references/gotchas.md
and follow it.
已知注意事项——各ConsentType对应的激活就绪校验规则(及其来源)、逗号分隔关键词的存储方式、“ImplicitOptIn仍需关键词记录”的陷阱、每种语言仅一条记录的唯一性要求、Unified SMS帮助/法语自定义规则,以及OptInPrompt在Unified SMS/WhatsApp/RCS渠道中的豁免规则。
排查异常结果或修改此功能前,请加载并遵循
references/gotchas.md
中的内容。