create-zleap-app 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/package.json +1 -1
  2. package/skills/zleap-cloud-app/SKILL.md +7 -7
  3. package/skills/zleap-cloud-app/references/app-runtime.md +3 -3
  4. package/skills/zleap-cloud-app/references/cloud-functions.md +28 -24
  5. package/skills/zleap-cloud-app/references/console-members.md +7 -17
  6. package/skills/zleap-cloud-app/references/limits.md +27 -36
  7. package/skills/zleap-cloud-app/references/manifest.md +24 -58
  8. package/skills/zleap-cloud-app/references/permissions.md +21 -21
  9. package/skills/zleap-cloud-app/references/sdk-database-files.md +9 -9
  10. package/skills/zleap-cloud-app/references/status-codes.md +123 -138
  11. package/skills/zleap-cloud-app/references/triggers.md +5 -5
  12. package/skills/zleap-cloud-app-release/SKILL.md +46 -80
  13. package/skills/zleap-cloud-app-release/references/app-center-install.md +24 -23
  14. package/skills/zleap-cloud-app-release/references/app-center-publish.md +66 -146
  15. package/skills/zleap-cloud-app-release/references/console-functions.md +18 -22
  16. package/skills/zleap-cloud-app-release/references/console-members.md +7 -17
  17. package/skills/zleap-cloud-app-release/references/console-release.md +37 -33
  18. package/skills/zleap-cloud-app-release/references/console-workspace.md +28 -83
  19. package/skills/zleap-cloud-app-release/references/dev-to-production.md +104 -361
  20. package/skills/zleap-cloud-app-release/references/permissions.md +21 -21
  21. package/skills/zleap-cloud-app-release/references/status-codes.md +123 -138
  22. package/templates/react-ts/scripts/zleap.mjs +16 -2
  23. package/templates/react-ts/src/cloud/client.ts +3 -3
  24. package/skills/zleap-cloud-app-release/references/console-legacy-release.md +0 -411
@@ -12,7 +12,7 @@
12
12
  | **权限类** | `SCOPE_FORBIDDEN`、`RULE_DENIED`、`ENV_FORBIDDEN` | 去授权或改规则,不要盲目重试 |
13
13
  | **数据类** | `SCHEMA_INVALID`、`VERSION_CONFLICT`、`INDEX_REQUIRED` | 改代码、改数据或建索引 |
14
14
  | **结果未知** | `COMMIT_UNKNOWN`、`NODE_LOST` | **用原操作编号查询**,不要换编号重试 |
15
- | **未就绪** | `RESOURCE_NOT_READY`、`FUNCTION_RELEASE_REQUIRED` | 等开通完成 / 签发并激活后再试 |
15
+ | **未就绪** | `RESOURCE_NOT_READY`、`FUNCTION_RELEASE_REQUIRED` | 等开通完成 / 发布就绪并绑定后再试 |
16
16
  | **繁忙或超限** | `APP_RATE_LIMITED`、`RESOURCE_EXHAUSTED` | 稍后重试,或按提示清理数据、调整用法 |
17
17
  | **临时故障** | `CALL_TIMEOUT`、`RUNTIME_UNAVAILABLE` | 可以重试 |
18
18
  | **平台未开放** | `UNSUPPORTED_OPERATION`、`FEATURE_UNAVAILABLE` | 改实现,重试无用 |
@@ -39,7 +39,7 @@
39
39
  | 字段 | 含义 |
40
40
  | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
41
41
  | `code` | 业务码,按段位归类:401xx 认证、403xx 拒绝、404xx 不存在、409xx 冲突、422xx 参数、429xx 超限、503xx 未就绪/暂不可用、50000 内部错误 |
42
- | `message` | **给人看的中文说明**。数据服务、发布激活等错误会说清具体原因,容量类会带上数字(如「本应用文档总数:已用 9800,上限 10000」) |
42
+ | `message` | **给人看的中文说明**。数据服务、发布等错误会说清具体原因,容量类会带上数字(如「本应用文档总数:已用 9800,上限 10000」) |
43
43
  | `data.reason` | **稳定的原因码**,程序据此分流(本页各表格里的码) |
44
44
  | `data.next_action` | **下一步做什么**(2026-10 新增),只有能由使用者自己处理的错误才带 |
45
45
  | `data` 其他字段 | 定位信息:`operation`、`operation_id`、`layer`,容量类的 `quota` / `used` / `limit`,查询类的 `scan_limit` / `suggested_index`,限流的 `app_concurrency_limit` |
@@ -112,36 +112,36 @@
112
112
 
113
113
  ### 通道与调用
114
114
 
115
- | 错误码 | 含义 | 可重试 | 处理 |
116
- | ----------------------------------- | --------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
117
- | `COMMIT_UNKNOWN` | **写操作结果未知**(写请求 30 秒未返回等) | ✅ | **用原 `operationId` 查回执**,确认前不要换编号重新写 |
118
- | `CALL_TIMEOUT` | 读请求 30 秒未返回 / 握手 15 秒未完成 / 作业等待超时 | ✅ | 可重试;带 `jobId` 时用 `jobs.wait` 继续等 |
119
- | `RUNTIME_UNAVAILABLE` | 通道已关闭或服务暂不可用 | ✅ | 稍后重试;页面卸载后通道不可再用 |
120
- | `APP_RATE_LIMITED` | 本应用此刻并发请求过多(单应用并发槽被占满) | ❌\* | 稍后重试;不要立刻循环重试 |
121
- | `RESOURCE_EXHAUSTED` | 超出限制(并发 >8、分页/排序/大小上限、配额) | — | 对照 [限制](limits.md) 调整;配额类需清理数据 |
122
- | `REQUEST_TOO_LARGE` | 请求体超过协商上限(默认 256 KiB) | ❌ | 拆分请求 |
123
- | `IDEMPOTENCY_CONFLICT` | 同一请求编号被重复使用,或同一操作编号用于不同内容 | ❌ | 新请求用新编号;重试同一写入时内容必须完全相同 |
124
- | `OPERATION_EXPIRED` | 操作编号超出首次使用窗口(300 秒)或回执已过期 | ❌ | 重新读取最新状态后,用新编号发起 |
125
- | `PROTOCOL_MISMATCH` | SDK 与宿主协议不一致,或响应结构异常 | ❌ | 使用与当前 OS 匹配的 SDK 版本 |
126
- | `BACKGROUND_CAPABILITY_UNAVAILABLE` | 宿主没有协商到 `app-execution/1`,`callFunction` / `capabilities.invoke` 无法执行 | ❌ | 先让使用者在应用窗口「权限」里勾选后台能力并保存;确认版本已签发并激活、部署开放后台执行。旧 SDK 报的是 `UNSUPPORTED_OPERATION`,升级 SDK |
127
- | `UNSUPPORTED_OPERATION` | 平台未实现或未协商的操作 | ❌ | 改实现,见 [未实现的 SDK 功能](limits.md#未实现的-sdk-功能) |
115
+ | 错误码 | 含义 | 可重试 | 处理 |
116
+ | ----------------------------------- | --------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
117
+ | `COMMIT_UNKNOWN` | **写操作结果未知**(写请求 30 秒未返回等) | ✅ | **用原 `operationId` 查回执**,确认前不要换编号重新写 |
118
+ | `CALL_TIMEOUT` | 读请求 30 秒未返回 / 握手 15 秒未完成 / 作业等待超时 | ✅ | 可重试;带 `jobId` 时用 `jobs.wait` 继续等 |
119
+ | `RUNTIME_UNAVAILABLE` | 通道已关闭或服务暂不可用 | ✅ | 稍后重试;页面卸载后通道不可再用 |
120
+ | `APP_RATE_LIMITED` | 本应用此刻并发请求过多(单应用并发槽被占满) | ❌\* | 稍后重试;不要立刻循环重试 |
121
+ | `RESOURCE_EXHAUSTED` | 超出限制(并发 >8、分页/排序/大小上限、配额) | — | 对照 [限制](limits.md) 调整;配额类需清理数据 |
122
+ | `REQUEST_TOO_LARGE` | 请求体超过协商上限(默认 256 KiB) | ❌ | 拆分请求 |
123
+ | `IDEMPOTENCY_CONFLICT` | 同一请求编号被重复使用,或同一操作编号用于不同内容 | ❌ | 新请求用新编号;重试同一写入时内容必须完全相同 |
124
+ | `OPERATION_EXPIRED` | 操作编号超出首次使用窗口(300 秒)或回执已过期 | ❌ | 重新读取最新状态后,用新编号发起 |
125
+ | `PROTOCOL_MISMATCH` | SDK 与宿主协议不一致,或响应结构异常 | ❌ | 使用与当前 OS 匹配的 SDK 版本 |
126
+ | `BACKGROUND_CAPABILITY_UNAVAILABLE` | 宿主没有协商到 `app-execution/1`,`callFunction` / `capabilities.invoke` 无法执行 | ❌ | 先让使用者在应用窗口「权限」里勾选后台能力并保存;确认安装已绑定就绪发布、部署开放后台执行。旧 SDK 报的是 `UNSUPPORTED_OPERATION`,升级 SDK |
127
+ | `UNSUPPORTED_OPERATION` | 平台未实现或未协商的操作 | ❌ | 改实现,见 [未实现的 SDK 功能](limits.md#未实现的-sdk-功能) |
128
128
 
129
129
  \* `retryable` 为 `false`,但稍等后重试通常能成功;持续出现说明有长任务占满了并发。
130
130
 
131
131
  ### 初始化与授权
132
132
 
133
- | 错误码 | 含义 | 处理 |
134
- | ---------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------- |
135
- | `INIT_REQUIRED` | 调用 `ready()` 前没有 `zl.cloud.init()` | 先初始化 |
136
- | `INIT_CONFLICT` | 同一页面用不同环境再次初始化 | 一个页面只绑定一个环境 |
137
- | `ENV_MISMATCH` | `env` 取值非法 | 只能是 `dev` / `prod`(或 `DYNAMIC_CURRENT_ENV`) |
138
- | `AUTH_REQUIRED` | 登录态或运行会话失效 | 重新打开应用 |
139
- | `SCOPE_FORBIDDEN` | 权限范围不允许(含未授权数据访问、生产文件存储未开放) | 见本页末尾「排查:`SCOPE_FORBIDDEN`」 |
140
- | `ENV_FORBIDDEN` | 应用要用的环境不存在或已停用 | 见下方「打开应用时的错误」 |
141
- | `PUBLISHER_REQUIRED` | 开发数据域只对开发团队开放(`appid` 应用成员 / 旧应用该版本上传者) | 请管理员在控制台「成员」里把你加为开发者;给其他人用需要发布为线上版本 |
142
- | `STALE_GENERATION` | 授权或数据绑定已换代(如重新授权、恢复备份) | 重新打开应用,建立新会话 |
143
- | `RULE_DENIED` | 集合记录规则拒绝了本次读/写 | 检查 `data.policies` 的 `read`/`write` 表达式与文档内容 |
144
- | `QUERY_NOT_AUTHORIZED` | 查询不在授权范围内(宿主白名单中的码,服务端来源**未验证**) | 检查查询条件与授权 |
133
+ | 错误码 | 含义 | 处理 |
134
+ | ---------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------- |
135
+ | `INIT_REQUIRED` | 调用 `ready()` 前没有 `zl.cloud.init()` | 先初始化 |
136
+ | `INIT_CONFLICT` | 同一页面用不同环境再次初始化 | 一个页面只绑定一个环境 |
137
+ | `ENV_MISMATCH` | `env` 取值非法 | 只能是 `dev` / `prod`(或 `DYNAMIC_CURRENT_ENV`) |
138
+ | `AUTH_REQUIRED` | 登录态或运行会话失效 | 重新打开应用 |
139
+ | `SCOPE_FORBIDDEN` | 权限范围不允许(含未授权数据访问、生产文件存储未开放) | 见本页末尾「排查:`SCOPE_FORBIDDEN`」 |
140
+ | `ENV_FORBIDDEN` | 应用要用的环境不存在或已停用 | 见下方「打开应用时的错误」 |
141
+ | `PUBLISHER_REQUIRED` | 开发数据域只对应用成员开放 | 请管理员在控制台「成员」里把你加为开发者;给其他人用需要发布为线上版本 |
142
+ | `STALE_GENERATION` | 授权或数据绑定已换代(如重新授权、恢复备份) | 重新打开应用,建立新会话 |
143
+ | `RULE_DENIED` | 集合记录规则拒绝了本次读/写 | 检查 `data.policies` 的 `read`/`write` 表达式与文档内容 |
144
+ | `QUERY_NOT_AUTHORIZED` | 查询不在授权范围内(宿主白名单中的码,服务端来源**未验证**) | 检查查询条件与授权 |
145
145
 
146
146
  ### 数据
147
147
 
@@ -164,17 +164,17 @@
164
164
 
165
165
  ### 发布与后台调用
166
166
 
167
- | 错误码 | 含义 | 处理 |
168
- | ----------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------- |
169
- | `FUNCTION_RELEASE_REQUIRED` | 当前安装还没有绑定已签发并激活的发布 | 在控制台版本页签发并激活(`appid` 应用:版本管理 → 开发环境:云函数激活) |
170
- | `RELEASE_UNAVAILABLE` | 发布代数已变化(激活了新版本),旧会话作废 | 宿主会自动重开会话并重试一次;仍失败时重新打开应用 |
171
- | `RELEASE_NOT_READY` | 发布候选尚未就绪 | 先完成签发 |
172
- | `RELEASE_DISABLED` | 发布候选已撤回 | 使用其他就绪候选 |
173
- | `RELEASE_ACTIVATION_UNAVAILABLE` | 目标环境不存在且无法自动创建 | 见 [发布与激活](#发布与激活) |
174
- | `RELEASE_ACTIVATION_TARGET_MISSING` | 激活目标与校验后的 Manifest 不一致(少见) | 见 [发布与激活](#发布与激活) |
175
- | `NODE_LOST` | 执行节点失联,**结果未确认**(作业状态 `unknown`) | 不要重复提交;用 `jobId` / `invocationId` 核对 |
176
- | `NODE_LOST_EXPIRED` | 节点失联且超过对账期限 | 到控制台运行记录核对是否已产生写入,再决定是否重新提交 |
177
- | `EXECUTION_FAILED` | `callFunction` 作业失败且没有更具体的错误码 | 到控制台运行记录或日志查看失败原因 |
167
+ | 错误码 | 含义 | 处理 |
168
+ | ----------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
169
+ | `FUNCTION_RELEASE_REQUIRED` | 当前安装还没有绑定就绪的签名发布 | 在应用窗口「权限」里允许后台运行(重新保存一次),或在控制台「版本管理」切换一次版本,平台自动补签并绑定;仍出现说明部署的发布签名不可用(联系平台管理员检查签名密钥 / 信任配置),或重新上传 |
170
+ | `RELEASE_UNAVAILABLE` | 发布代数已变化(安装绑定了新版本),旧会话作废 | 宿主会自动重开会话并重试一次;仍失败时重新打开应用 |
171
+ | `RELEASE_NOT_READY` | 发布候选尚未就绪 | 重新发布,平台会重新签发 |
172
+ | `RELEASE_DISABLED` | 发布候选已撤回 | 重新上传并发布 |
173
+ | `RELEASE_ACTIVATION_UNAVAILABLE` | 目标环境不存在且无法自动创建 | 通常是部署未开放对应环境;请联系平台管理员 |
174
+ | `RELEASE_ACTIVATION_TARGET_MISSING` | 激活目标与校验后的 Manifest 不一致(少见) | 重新上传并安装该版本 |
175
+ | `NODE_LOST` | 执行节点失联,**结果未确认**(作业状态 `unknown`) | 不要重复提交;用 `jobId` / `invocationId` 核对 |
176
+ | `NODE_LOST_EXPIRED` | 节点失联且超过对账期限 | 到控制台运行记录核对是否已产生写入,再决定是否重新提交 |
177
+ | `EXECUTION_FAILED` | `callFunction` 作业失败且没有更具体的错误码 | 到控制台运行记录或日志查看失败原因 |
178
178
 
179
179
  `callFunction` 失败时,`errCode` 优先使用作业结果里的 `errorCode`;作业状态为 `unknown` 时抛 `COMMIT_UNKNOWN`,
180
180
  仍在排队/执行时抛 `CALL_TIMEOUT`(都带 `jobId`,可用 `jobs.wait` 继续等)。`capabilities.invoke` 不抛错,
@@ -205,10 +205,10 @@
205
205
 
206
206
  | 原因码 | message | next_action / 处理 |
207
207
  | --------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------- |
208
- | `ENV_FORBIDDEN`(环境不存在) | 环境不可访问 | 「该应用还没有开通生产环境:先在应用页把版本激活到生产,再用生产数据」 |
208
+ | `ENV_FORBIDDEN`(环境不存在) | 环境不可访问 | 「该应用还没有开通生产环境:发布为线上版本时会自动准备生产环境,稍后重试」 |
209
209
  | `ENV_FORBIDDEN`(环境已停用) | 环境不可访问 | 「该环境的记录已被停用,请回应用页重新加载,或在「数据权限」里重新保存一次授权」 |
210
210
  | `ENV_FORBIDDEN`(部署未开放生产) | 生产 Cloud 运行能力尚未开放 / 本部署未开放生产环境 | 部署未开放生产时只能用开发环境 |
211
- | `PUBLISHER_REQUIRED` | 环境不可访问 | 非发布者打开只有开发环境的应用;上线到生产后才能给其他人用 |
211
+ | `PUBLISHER_REQUIRED` | 环境不可访问 | 非应用成员打开只有开发环境的应用;发布为线上版本后才能给其他人用 |
212
212
  | `CONSENT_REQUIRED` | 请先由宿主用户明确授权数据访问 | 在应用窗口「权限」里勾选后保存(应用里表现为 `SCOPE_FORBIDDEN`) |
213
213
  | `STORAGE_PROD_UNAVAILABLE` | 生产文件存储尚未开放 | 部署未开放生产文件存储(应用里表现为 `SCOPE_FORBIDDEN`) |
214
214
  | `RESOURCE_NOT_READY` | 基础服务未就绪 | 环境的云资源还没接上,稍后重新打开 |
@@ -289,39 +289,30 @@
289
289
 
290
290
  上传同一路径的文件时,没有 `overwrite` + `expectedETag` 就会得到 `VERSION_CONFLICT`。
291
291
 
292
- ## 发布与激活
293
-
294
- 激活冲突统一为 40900「发布激活未完成」,`data` 里同时带 `reason` 和 `next_action`:
295
-
296
- | 原因码 | next_action |
297
- | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
298
- | `RELEASE_NOT_READY` | 这个发布版本还没就绪:先签发并等校验完成 |
299
- | `RELEASE_PROOF_UNAVAILABLE` | 这个发布版本缺少可验证的签名证明:重新签发它 |
300
- | `RELEASE_POLICY_STALE` | 发布版本记录的是旧策略:重新签发让它绑定当前策略 |
301
- | `RELEASE_TRUST_UNAVAILABLE` | 这个发布版本的签名与当前信任策略对不上:重新签发它,或让管理员按当前策略重新审批 |
302
- | `RELEASE_APPROVAL_EXPIRED_OR_MISSING` | 这个发布版本没有有效的生产审批:让管理员在发布审核里批准后再激活到生产 |
303
- | `PRODUCTION_RELEASE_UNAVAILABLE` | 本部署没有可用的生产签发方:先配好生产签发密钥,或改用开发环境 |
304
- | `RELEASE_VERSION_SWITCH_UNAVAILABLE` | 安装的版本与这个发布版本不一致:先把安装升级到该版本再激活 |
305
- | `ACTIVATION_EPOCH_STALE` | 安装的授权状态已经变化:刷新页面后重新点激活 |
306
- | `ACTIVATION_EPOCH_REQUIRED` | 该安装已绑定过发布版本:带上当前授权代数再激活(刷新页面会自动带上) |
307
- | `ACTIVATION_REQUEST_REQUIRED` | 缺少 request_id:重新点一次激活会生成新的 request_id |
308
- | `RELEASE_STATE_CHANGED` | 发布状态在激活过程中变了:刷新页面后重试 |
309
- | `ROLLBACK_TARGET_UNAVAILABLE` | 当前并没有绑定到要回滚的版本:刷新页面后重试 |
310
- | `IDEMPOTENCY_CONFLICT` | 这个 request_id 已经用于另一次请求:重试会生成新的 request_id |
311
- | `RELEASE_ACTIVATION_UNAVAILABLE` | 该应用还没有这个环境:先在「数据权限」里选择这个环境再激活 |
312
- | `RELEASE_ACTIVATION_TARGET_MISSING` | (见下方说明) |
313
- | `RELEASE_DISABLED`、`RELEASE_ACTIVATION_SCOPE_REQUIRED`、`RELEASE_ARTIFACT_MISMATCH`、`FUNCTION_RUNTIME_SNAPSHOT_REQUIRED` | 无(按原因码处理) |
292
+ ## 发布与生产门禁
293
+
294
+ 第一次发布带云资源的版本时,平台自动完成**应用级**生产准备:生产环境 → 签发生产发布(归属上传者)→ 生产门禁 → 生产库与生产集合,
295
+ 不依赖任何人的安装。生产门禁不通过时统一返回 40900,`data` 里同时带 `reason` 和 `next_action`:
296
+
297
+ | 原因码 | next_action |
298
+ | ------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
299
+ | `RELEASE_NOT_READY` | 这个发布版本还没就绪:重新发布,平台会重新签发 |
300
+ | `RELEASE_PROOF_UNAVAILABLE` | 这个发布版本缺少可验证的签名证明:重新发布会重新签发 |
301
+ | `RELEASE_POLICY_STALE` | 发布版本记录的是旧策略:重新发布会按当前策略重新签发 |
302
+ | `RELEASE_TRUST_UNAVAILABLE` | 签名与当前信任策略对不上:重新发布,或让管理员检查发布信任配置 |
303
+ | `RELEASE_APPROVAL_EXPIRED_OR_MISSING` | 这个发布版本没有有效的生产审批:重新发布会重新签发 |
304
+ | `PRODUCTION_RELEASE_UNAVAILABLE` | 本部署没有可用的生产签发方:先配好生产签发密钥,或改用开发环境 |
305
+ | `RELEASE_DISABLED`、`RELEASE_ARTIFACT_MISMATCH`、`FUNCTION_RUNTIME_SNAPSHOT_REQUIRED` | 无(按原因码处理);重新上传或重新发布 |
314
306
 
315
307
  需要知道的变化:
316
308
 
317
- - **激活不再要求先允许后台能力**;**目标环境不存在时激活会自动创建它**(含数据库开通请求)。
318
- 所以 `RELEASE_ACTIVATION_UNAVAILABLE` 只在自动创建也失败时出现;生产环境未开放时自动创建返回 40300「本部署未开放生产环境」。
319
- - `RELEASE_ACTIVATION_TARGET_MISSING` 现在只在「已缓存的 Manifest 判定为纯前端、校验后的 Manifest 却不是」这种少见情况出现。
320
- 它的提示文字仍写着「先勾选后台能力」,这句已过时:遇到时重新上传并安装该版本即可。
321
- - 安装从未绑定过发布时,首次激活可以不带 `expected_activation_epoch`。
322
- - 生产不可用有两种返回:激活接口的 40300(`message` 为 `PRODUCTION_RELEASE_UNAVAILABLE`,`reason` 为
309
+ - 生产门禁由平台自动检查(签名证明、审批窗口、策略版本、信任根、函数运行快照、生产签发方),
310
+ 所有步骤自动完成;不通过时按上表给出原因,**重新发布会重新签发**。
311
+ - 已经发布过的版本再次发布(包括回退)直接复用当时的就绪发布,不会重新跑一遍生产准备。
312
+ - 生产不可用有两种返回:发布接口的 40300(`message` 为 `PRODUCTION_RELEASE_UNAVAILABLE`,`reason` 为
323
313
  `DEPLOYMENT_NOT_PRODUCTION` / `PRODUCTION_RELEASE_UNAVAILABLE` / `RELEASE_TRUST_UNAVAILABLE`,不带 `next_action`),
324
314
  以及生产门禁的 40900(带上表的 `next_action`)。前者是部署没开放生产,不是你写错了。
315
+ - 发布本身的其他失败(生产库未就绪、上传者账号已停用)见 [发布为线上版本](#发布为线上版本)。
325
316
 
326
317
  ## 后台调用与云函数
327
318
 
@@ -331,7 +322,7 @@
331
322
  | ------------------------------------ | --------------------------------------- | ---------------------------------------- |
332
323
  | 50390 | 应用执行worker尚未启用 | 部署未开放后台执行,联系管理员 |
333
324
  | 50390 `FUNCTION_RUNTIME_UNAVAILABLE` | 应用执行需要共享调度服务 | 同上 |
334
- | 40300 `FUNCTION_RELEASE_REQUIRED` | 云函数必须绑定已验证发布 | 签发并激活 |
325
+ | 40300 `FUNCTION_RELEASE_REQUIRED` | 云函数必须绑定已验证发布 | 见 [发布与后台调用](#发布与后台调用) |
335
326
  | 40900(无原因码) | 同一操作编号的输入不同 | 新调用用新的操作编号 |
336
327
  | 40900(无原因码) | 首次受理操作已过期 | 用新的操作编号重新提交 |
337
328
  | 42900 | 调用历史容量已满 / 本人后台调用队列已满 | 等在途作业结束后再提交(每人最多 16 个) |
@@ -406,24 +397,23 @@
406
397
 
407
398
  `zleap-app prepare` 的特殊结果:
408
399
 
409
- - **平台 `appid` 应用**只准备开发环境:只声明数据的应用在开发权限阶段后结束,`status` 为 **`ready`**,响应里 `"environment": "dev"`;
410
- Manifest 声明了 headless 后台能力时,还会创建发布候选、签名并激活到开发。
411
- - **旧 `app_key` 应用**没有声明云资源(无 `cloud.*` 权限、无后台能力、无集合)时直接返回 `status` 为 **`not_required`**,
412
- `next` 提示「应用未声明云资源或后台执行,安装后即可运行」。
400
+ - 通常不需要 `prepare`(上传时自动签名、安装 / 切换版本时自动绑定),只在 `zleap-app diagnose` 提示 `next_action: app_prepare` 时兜底使用。
401
+ 它只准备开发环境:只声明数据的应用在开发权限阶段后结束,`status` 为 **`ready`**,响应里 `"environment": "dev"`;
402
+ Manifest 声明了 headless 后台能力时,还会创建发布候选、签名并绑定到开发环境。
413
403
  - 某个阶段失败时,`data` 里带 `stage`(失败的阶段)、`completed_stages`(已完成的阶段)、`cause.reason`(原因码)、
414
404
  `next`(「用app_diagnose核对当前状态;不自动重试准备写操作」),内层错误有 `next_action` 时也一并带上。
415
405
  用**同一个** `--request-id` 重试会从失败的阶段继续。
416
406
  - 其他失败:42200「version_id和32位小写十六进制request_id必填」、40900「请先安装指定版本」、
417
- 40300「只能准备本人private应用」(旧应用)、40300「只能准备本人上传的版本」(`appid` 应用传了别人上传的 `version_id`)、
407
+ 40300「只能准备本人上传的版本」(传了别人上传的 `version_id`)、
418
408
  42200「应用执行或共享调度未启用,需要平台管理员完成部署」、40900「准备结果未确认,请先诊断」。不传 `--request-id` 时命令行会自动生成。
419
409
 
420
410
  > **`prepare` 支持哪些版本**(说明)
421
411
  >
422
412
  >
423
- > - **平台 `appid` 应用**:接受**本人上传**的版本(可见性 `private` 或 `members`),只准备开发环境
424
- > (开发环境 → 数据库 → 开发数据域权限,声明了 headless 时再加签名并激活到开发),不会碰生产;
425
- > 生产由**首次 `release`(发布为线上版本)**自动准备。声明了 headless 时,它等同于控制台「版本管理」下方「**开发环境:云函数激活**」。
426
- > - **旧 `app_key` 应用**:只接受**本人 private、且已安装**的包,一路准备到生产。
413
+ > 只接受**本人上传**的版本(可见性 `members`),只准备开发环境
414
+ > (开发环境 → 数据库 → 开发数据域权限,声明了 headless 时再加签名并绑定到开发环境),不会碰生产;
415
+ > 生产由**首次发布为线上版本**自动准备。因为自动签名与绑定,通常不需要它,只在 `diagnose` 提示 `next_action: app_prepare` 时兜底使用。
416
+ >
427
417
 
428
418
  `zleap-app publish` 等写操作网络结果不明时返回 `COMMIT_UNKNOWN`,**不会自动重传**:
429
419
  用 `zleap-app operation --request-id <原操作号>` 或 `zleap-app status` 查询原结果。
@@ -432,28 +422,24 @@
432
422
 
433
423
  上传、`zleap-app check` 或安装时,Manifest 相关失败通过 `detail.reason` 返回:
434
424
 
435
- | 原因 | 含义 | 处理 |
436
- | ----------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------- |
437
- | `MANIFEST_UNSUPPORTED` | `schema` 不是 `zleap.app/2`、结构/引用/执行形态无效,或 `appid` 与 `app_key` 不一致 | 对照 [Manifest](manifest.md) 逐字段核对 |
438
- | `SCHEMA_INVALID` | 集合 Schema 不符合数据面契约(`detail.collection` 指出集合) | 只用集合 Schema 子集 |
439
- | `RULE_DENIED` | 集合记录规则表达式无效 | 修正表达式 |
440
- | `RULE_FIELD_UNDECLARED` | 记录规则引用了 Schema 未声明的字段 | 在 Schema 顶层声明该字段 |
441
- | `RUNTIME_UNAVAILABLE` | 运行环境未开放(`builtin` UI、纯后台带函数等) | 见 [不可安装的配置](limits.md#已知会导致「应用不可安装」的配置) |
442
- | `FEATURE_UNAVAILABLE` | 声明了未开放的能力或写法 | 同上 |
425
+ | 原因 | 含义 | 处理 |
426
+ | ----------------------- | ------------------------------------------------------------ | -------------------------------------------------------------- |
427
+ | `MANIFEST_UNSUPPORTED` | `schema` 不是 `zleap.app/2`、结构/引用/执行形态无效 | 对照 [Manifest](manifest.md) 逐字段核对 |
428
+ | `SCHEMA_INVALID` | 集合 Schema 不符合数据面契约(`detail.collection` 指出集合) | 只用集合 Schema 子集 |
429
+ | `RULE_DENIED` | 集合记录规则表达式无效 | 修正表达式 |
430
+ | `RULE_FIELD_UNDECLARED` | 记录规则引用了 Schema 未声明的字段 | 在 Schema 顶层声明该字段 |
431
+ | `RUNTIME_UNAVAILABLE` | 运行环境未开放(`builtin` UI、纯后台带函数等) | 见 [不可安装的配置](limits.md#已知会导致「应用不可安装」的配置) |
432
+ | `FEATURE_UNAVAILABLE` | 声明了未开放的能力或写法 | 同上 |
443
433
 
444
434
  常见的上传失败文案(没有原因码,直接看提示):
445
435
 
446
- | 提示 | 原因 |
447
- | ----------------------------------------------------- | ----------------------------------------------------------------- |
448
- | 应用包根目录必须包含非空 LICENSE 文件 | 缺少 `LICENSE` 或内容为空 |
449
- | manifest entry 必须指向存在的包内 HTML 文件 | `entry` 不是包内 `.html`/`.htm`,或文件不存在 |
450
- | manifest 的 appid 与 app_key 不一致 | 同时写了 `appid` 和 `app_key` 且两者不同(42200),只保留 `appid` |
451
- | manifest app_key 必须使用包含发布者前缀的小写命名空间 | 应用标识既不是平台 `appid`,也不符合旧 `app_key` 命名空间规则 |
452
- | 发布者声明不属于当前登录用户 | 仅旧 `app_key` 应用:`publisher.publisher_id` 不是上传者本人 |
453
- | 不能覆盖其他发布者的应用标识 | 仅旧 `app_key` 应用:`app_key` 已被别人使用 |
454
- | 该版本已经存在,请更换版本号 | 同版本号、内容不同 |
455
- | 云函数制品入口缺失 | 函数 `entry` 在包里不存在 |
456
- | 应用包不在开发会话授权范围 | 包里的 `appid` 与 `zleap-app auth login` 时不一致 |
436
+ | 提示 | 原因 |
437
+ | ------------------------------------------- | ------------------------------------------------- |
438
+ | 应用包根目录必须包含非空 LICENSE 文件 | 缺少 `LICENSE` 或内容为空 |
439
+ | manifest entry 必须指向存在的包内 HTML 文件 | `entry` 不是包内 `.html`/`.htm`,或文件不存在 |
440
+ | 该版本已经存在,请更换版本号 | 同版本号、内容不同 |
441
+ | 云函数制品入口缺失 | 函数 `entry` 在包里不存在 |
442
+ | 应用包不在开发会话授权范围 | 包里的 `appid` 与 `zleap-app auth login` 时不一致 |
457
443
 
458
444
  ### 应用与成员
459
445
 
@@ -468,36 +454,35 @@
468
454
 
469
455
  成员管理见 [成员管理](console-members.md)。
470
456
 
471
- ### 发布为线上版本与目录可见性
457
+ ### 发布为线上版本
472
458
 
473
- 控制台「版本管理」发布 / 回退(`POST /api/v1/app-cloud/apps/{app_id}/publish`),以及应用中心「发布到企业目录 / 撤回企业目录」:
459
+ 控制台「版本管理」发布 / 回退(`POST /api/v1/app-cloud/apps/{app_id}/publish`):
474
460
 
475
- | 业务码 | message | `detail.reason` | 处理(`next_action`) |
476
- | ------ | -------------------------------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------ |
477
- | 40900 | 发布带云资源的版本前,上传者需要正在使用这个版本 | `UPLOADER_NOT_ON_VERSION` | 请上传者打开应用并切换到这个版本(npm run deploy 会自动切换),再发布 |
478
- | 40900 | 这个应用请在云开发控制台「版本管理」里发布或回退 | `USE_VERSION_MANAGEMENT` | 应用中心不能改平台 `appid` 应用的线上版本;到控制台「发布 → 版本管理」点「发布为线上版本」或「回退到此版本」 |
479
- | 40900 | 该应用使用旧的命名空间标识,请在「版本与激活」里管理版本 | `LEGACY_APP` | 旧 `app_key` 应用走「版本与激活」 |
480
- | 40400 | 版本不存在或已删除 / 该版本没有可用制品 | — | 刷新版本列表后重试 |
481
- | 42200 | 发布说明最多 500 字 | — | 缩短发布说明 |
482
- | 40400 | 应用不存在,或你不是这个应用的成员 | — | 请联系应用管理员在云开发控制台「成员」里把你加为开发者 |
461
+ | 业务码 | message | `detail.reason` | 处理(`next_action`) |
462
+ | ------ | --------------------------------------- | ------------------------- | --------------------------------------------------------------------------------- |
463
+ | 40900 | 生产数据库还没就绪,暂时不能发布 | `PROD_DATABASE_NOT_READY` | 通常 1 分钟内就绪,稍后在版本管理里重新发布;持续失败请在控制台「数据库」查看状态 |
464
+ | 40900 | 这个版本的上传者账号已停用,无法发布 | `UPLOADER_INACTIVE` | 请其他成员重新上传这个版本(npm run deploy)后再发布 |
465
+ | 40400 | 版本不存在或已删除 / 该版本没有可用制品 | — | 刷新版本列表后重试 |
466
+ | 42200 | 发布说明最多 500 字 | — | 缩短发布说明 |
467
+ | 40400 | 应用不存在,或你不是这个应用的成员 | — | 请联系应用管理员在云开发控制台「成员」里把你加为开发者 |
483
468
 
484
- `USE_VERSION_MANAGEMENT` 来自应用中心的「发布到企业目录 / 撤回企业目录」接口,不是版本管理接口本身的错误;
485
- 它表示**这个应用不该在应用中心改线上状态**。平台 `appid` 应用请改用控制台「版本管理」。
486
-
487
- `UPLOADER_NOT_ON_VERSION` 只出现在带云资源(集合、`cloud.*` 能力、`runtime.backend` 或 headless 能力)的版本上,且只在**第一次发布**时要求;已经发布过的版本再次发布会复用生产准备。见 版本管理 · 带云资源的版本(文档站 /console/release#带云资源的版本)。
469
+ 任一成员都可以发布任一版本,不要求上传者正在使用这个版本。带云资源(集合、`cloud.*` 能力、`runtime.backend` 或 headless 能力)的版本**第一次**发布时,
470
+ 平台自动完成应用级生产准备(生产环境 → 签发生产发布 → 生产门禁 → 生产库与生产集合),`PROD_DATABASE_NOT_READY`、`UPLOADER_INACTIVE` 只在这一步出现;
471
+ 生产门禁不通过时返回 [发布与生产门禁](#发布与生产门禁) 表中的原因码(如 `RELEASE_APPROVAL_EXPIRED_OR_MISSING`、`RELEASE_POLICY_STALE`、`PRODUCTION_RELEASE_UNAVAILABLE`),重新发布即会重新签发。
472
+ 已经发布过的版本再次发布(包括回退)直接复用当时的就绪发布。见 版本管理 · 带云资源的版本(文档站 /console/release#带云资源的版本)。
488
473
 
489
474
  ## 版本更新与回滚
490
475
 
491
- ### 版本切换(控制台「我也用这个」/ CLI `update`、`rollback`)
476
+ ### 版本切换(控制台「切换到此版本」/ CLI `update`、`rollback`)
492
477
 
493
478
  这些码来自安装版本切换接口(`appversion/read.go`、`official.go`、`apply.go`):
494
479
 
495
- | 业务码 | message | `detail.reason` | 处理 |
496
- | ------ | -------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
497
- | 42200 | 应用没有可切换的版本 | `VERSION_LIST_EMPTY` | 该应用还没有任何有效版本,或你的账号看不到任何版本;先在控制台的版本页确认已有上传(`appid`:版本管理;旧应用:版本与激活),再刷新 |
498
- | 42200 | 官方版本切换必须指定当前安装版本 | `EXPECTED_VERSION_REQUIRED` | 请求里带上当前安装的版本 ID(CLI 用 `--expected-version-id`),不要省略 |
499
- | 40900 | 安装版本已变化 | `INSTALLATION_VERSION_STALE` | 你带来的「当前版本」与安装记录不一致;重新读取安装状态后,用最新的版本 ID 再操作 |
500
- | 40900 | 安装版本已变化 | `INSTALLATION_VERSION_CHANGED` | 提交期间安装被其他操作改掉了;刷新后重新读取,再决定是否重试 |
480
+ | 业务码 | message | `detail.reason` | 处理 |
481
+ | ------ | -------------------------------- | ------------------------------ | ---------------------------------------------------------------------------------------------- |
482
+ | 42200 | 应用没有可切换的版本 | `VERSION_LIST_EMPTY` | 该应用还没有任何有效版本,或你的账号看不到任何版本;先在控制台「版本管理」确认已有上传,再刷新 |
483
+ | 42200 | 官方版本切换必须指定当前安装版本 | `EXPECTED_VERSION_REQUIRED` | 请求里带上当前安装的版本 ID(CLI 用 `--expected-version-id`),不要省略 |
484
+ | 40900 | 安装版本已变化 | `INSTALLATION_VERSION_STALE` | 你带来的「当前版本」与安装记录不一致;重新读取安装状态后,用最新的版本 ID 再操作 |
485
+ | 40900 | 安装版本已变化 | `INSTALLATION_VERSION_CHANGED` | 提交期间安装被其他操作改掉了;刷新后重新读取,再决定是否重试 |
501
486
 
502
487
  `INSTALLATION_VERSION_STALE` 在写入前检查就失败;`INSTALLATION_VERSION_CHANGED` 是写入时的并发校验失败(CAS 没命中)。
503
488
  两者都**不要用旧的版本 ID 盲目重试**,先 `zleap-app diagnose` 或在控制台刷新安装状态。
@@ -533,26 +518,26 @@
533
518
  >
534
519
  > 这个码由 CLI/MCP 的版本切换接口返回。应用中心的「更新」走上面的预检流程,Schema 变化只是提醒,分区变化才阻断。
535
520
 
536
- ## 签名证明验证
521
+ ## 发布签名
537
522
 
538
- 在控制台版本页(`appid` 应用是「版本管理」,旧 `app_key` 应用是「版本与激活」)验证签名证明时,失败按原因码归类显示:
523
+ 平台在上传带后台能力的版本时自动签发开发发布,首次发布为线上版本时自动签发生产发布。
524
+ 签发或验签失败时按原因码归类返回:
539
525
 
540
- | 服务端原因码 | 界面文案 |
541
- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
542
- | `RELEASE_PROOF_TOO_LARGE`(或本地检查文件 > 2 MiB) | 证明文件超过 2 MiB 限制。 |
543
- | `RELEASE_PROOF_INVALID` | 证明 JSON 或签名信封无效。 |
544
- | `RELEASE_IDENTITY_MISMATCH`、`RELEASE_DIGEST_MISMATCH`、`RELEASE_SOURCE_MISMATCH` | 证明与当前应用、发布、包、来源、摘要或策略不匹配。 |
545
- | `RELEASE_SIGNATURE_INVALID` | 无法验证发布签名。 |
546
- | `RELEASE_ARTIFACT_MISMATCH`、`RELEASE_MANIFEST_MISMATCH` | 签名 Manifest 或包制品清单不匹配。 |
547
- | `RELEASE_POLICY_STALE` | 策略审核已过期或不再当前。 |
548
- | `RELEASE_POLICY_UNAVAILABLE` | 尚未配置发布策略,无法验证。 |
549
- | `RELEASE_TRUST_UNAVAILABLE` | 发布信任策略尚未配置,或发布者密钥不可用、已撤销或已过期。请由管理员检查配置后重试。 |
550
- | `RELEASE_DISABLED` | 此发布候选已撤回。 |
551
- | 其他 | 签名证明验证请求被拒绝。 |
552
- | 网络结果不明 | 结果未确认,已保留原发布与签名证明。请查询原结果,确认前不会重复提交。 |
526
+ | 服务端原因码 | 含义 |
527
+ | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
528
+ | `RELEASE_PROOF_TOO_LARGE` | 证明文件超过 2 MiB 限制 |
529
+ | `RELEASE_PROOF_INVALID` | 证明 JSON 或签名信封无效 |
530
+ | `RELEASE_IDENTITY_MISMATCH`、`RELEASE_DIGEST_MISMATCH`、`RELEASE_SOURCE_MISMATCH` | 证明与当前应用、发布、包、来源、摘要或策略不匹配 |
531
+ | `RELEASE_SIGNATURE_INVALID` | 无法验证发布签名 |
532
+ | `RELEASE_ARTIFACT_MISMATCH`、`RELEASE_MANIFEST_MISMATCH` | 签名 Manifest 或包制品清单不匹配 |
533
+ | `RELEASE_POLICY_STALE` | 策略审核已过期或不是当前策略 |
534
+ | `RELEASE_POLICY_UNAVAILABLE` | 尚未配置发布策略,无法验证 |
535
+ | `RELEASE_TRUST_UNAVAILABLE` | 发布信任策略尚未配置,或发布者密钥不可用、已撤销或已过期;由管理员检查 |
536
+ | `RELEASE_DISABLED` | 发布候选已撤回 |
537
+ | 其他 | 签名验证请求被拒绝 |
553
538
 
554
- 验证签名时的 `RELEASE_POLICY_UNAVAILABLE`、`RELEASE_TRUST_UNAVAILABLE` 属于**部署未配置**;
555
- 激活到生产时的 `RELEASE_TRUST_UNAVAILABLE` 则表示这个发布的签名与当前信任策略对不上,重新签发即可(见 [发布与激活](#发布与激活))。
539
+ 签发时的 `RELEASE_POLICY_UNAVAILABLE`、`RELEASE_TRUST_UNAVAILABLE` 属于**部署未配置**;
540
+ 发布生产版本时的 `RELEASE_TRUST_UNAVAILABLE` 则表示这个发布的签名与当前信任策略对不上,重新发布即可(见 [发布与生产门禁](#发布与生产门禁))。
556
541
 
557
542
  ## 触发器与事件
558
543
 
@@ -598,8 +583,6 @@
598
583
  | 日志库未开通导致云函数执行失败(`LOG_UNAVAILABLE` / `TELEMETRY_ALLOCATION_UNAVAILABLE`) | 云函数照常执行,只是暂时查不到日志 |
599
584
  | 写入时偶发 `DATA_SERVICE_UNAVAILABLE`(数据绑定缺少身份记录) | 平台自动补建,不再报错 |
600
585
  | 数据库已存在但数据服务尚未加载时 `RESOURCE_NOT_READY` | 按专属库是否存在判定,已开通的库直接可用 |
601
- | 激活要求「至少允许一项后台能力」(`RELEASE_ACTIVATION_TARGET_MISSING`) | 激活不再要求后台能力 |
602
- | 激活到不存在的环境(`RELEASE_ACTIVATION_UNAVAILABLE`) | 激活时自动创建环境 |
603
586
 
604
587
  ## 状态值
605
588
 
@@ -618,6 +601,8 @@
618
601
 
619
602
  ### 发布候选
620
603
 
604
+ 发布候选由平台自动创建和签名,不需要手动操作。
605
+
621
606
  | 状态 | 控制台文案 |
622
607
  | ------------ | ---------- |
623
608
  | `draft` | 草稿 |
@@ -625,7 +610,7 @@
625
610
  | `ready` | 已就绪 |
626
611
  | `disabled` | 已撤回 |
627
612
 
628
- 只有「已就绪」的候选可以激活。生产门禁评估结论:`eligible`「等待 Provider 复核」、
613
+ 只有「已就绪」的候选可以用于发布。生产门禁评估结论:`eligible`「等待 Provider 复核」、
629
614
  `blocked`「已阻断」、`invalid`「不可用」。
630
615
 
631
616
  ### 后台作业
@@ -115,8 +115,8 @@
115
115
 
116
116
  1. 触发器指向的**后台能力已启用**:在应用窗口「权限」的「后台能力(定时任务 / 云函数)」里勾选,
117
117
  或在 后台能力面板(文档站 /console/functions#后台能力) 点「允许后台运行」(安装时后台能力一律是停用);
118
- 2. 如果该能力的 provider 是云函数(`managed_function`),当前安装还要绑定**就绪并已激活**的发布
119
- (appid 应用在版本管理(文档站 /console/release)页下方「开发环境:云函数激活」),否则执行时报 `FUNCTION_RELEASE_REQUIRED`;
118
+ 2. 如果该能力的 provider 是云函数(`managed_function`),当前安装还要绑定**就绪**的签名发布,否则执行时报 `FUNCTION_RELEASE_REQUIRED`。
119
+ 平台在上传时自动签名、安装 / 切换版本 / 授权时自动绑定,不需要手动操作;
120
120
  3. Manifest 里**确实声明了**这个触发器;
121
121
  4. `background.modes` 包含对应模式。
122
122
 
@@ -378,7 +378,7 @@
378
378
 
379
379
  ### 报 `TRIGGER_MODE_NOT_DECLARED`
380
380
 
381
- `background.modes` 里没有 `"scheduled"`(或 `"events"`)。补上后上传新版本、把安装更新到该版本,再到「版本管理」页下方「开发环境:云函数激活」重新激活(云函数类能力需要)。
381
+ `background.modes` 里没有 `"scheduled"`(或 `"events"`)。补上后上传新版本、把安装更新到该版本(切换时平台自动绑定新版本的就绪发布)。
382
382
 
383
383
  ### 报 `TRIGGER_NOT_DECLARED`
384
384
 
@@ -387,7 +387,7 @@ Manifest 里找不到这个触发器 ID、ID 重复,或它的 `capability` 指
387
387
  ### 报 `TRIGGER_SCHEDULE_MISMATCH`
388
388
 
389
389
  提交的 cron 和 Manifest 里写的**不完全一致**。控制台的 cron 直接取自声明,正常情况下不会出现;
390
- 如果出现,确认当前安装的就是你修改并签名后的那个版本。
390
+ 如果出现,确认当前安装的就是你修改后上传的那个版本。
391
391
 
392
392
  ### 报 `TRIGGER_TIMEZONE_MISMATCH`
393
393
 
@@ -400,7 +400,7 @@ Manifest 里找不到这个触发器 ID、ID 重复,或它的 `capability` 指
400
400
 
401
401
  1. 后台能力是「已允许后台运行」吗?显示「授权给的是之前安装的版本」时触发器会暂停,需要重新授权。
402
402
  切换版本后:应用中心「更新」只会让**权限变宽**的能力需要重新确认;CLI `zleap-app update` / `rollback` 会**停用全部**后台能力;
403
- 2. 云函数类能力:当前安装绑定了就绪发布吗?运行记录里出现 `FUNCTION_RELEASE_REQUIRED` 就到「版本管理」页下方「开发环境:云函数激活」完成激活;
403
+ 2. 云函数类能力:当前安装绑定了就绪发布吗?运行记录里出现 `FUNCTION_RELEASE_REQUIRED` 时,在应用窗口「权限」里允许后台运行(重新保存一次),或在「版本管理」切换一次版本,平台自动补签并绑定;
404
404
  3. 「接下来」的时间是不是还没到?
405
405
  4. 数据库是否正在冻结(备份/恢复中)?
406
406
  5. 看卡片的「最近投递」,再到 日志(文档站 /console/logs) 按调用编号查有没有执行记录。