@alipay/alipay-aipay 1.6.1-beta.3 → 1.6.1-beta.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alipay/alipay-aipay",
3
- "version": "1.6.1-beta.3",
3
+ "version": "1.6.1-beta.5",
4
4
  "description": "支付宝 AI 付 Skill 安装包 - 优先安装 Agent Skill,并在 macOS/Linux 后台准备用户级 CLI 工具",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6.1-beta.3
1
+ 1.6.1-beta.5
@@ -203,7 +203,7 @@ runner 失败时不得展示手写方案或进入步骤 3。成功时必须取
203
203
 
204
204
  - `full_process`:`../normal/full-process-routing.md` 已使用同一个 `integration.start.confirm`,在同一方案中绑定检查器产生的项目来源、代码状态和其他产品,以及产品、项目路径、语言/框架和服务声明;消息送达后已经直接进入本步骤,禁止再次渲染或要求确认。该消息不展示步骤清单,也不缩减执行范围;后续仍必须按当前产品完成本 flow 的全部适用接口、完成条件和 checklist。用户中断后若项目、产品、语言或框架发生变化,返回完整接入 router 重新澄清和扫描,再输出一条当前方案并继续。该方案仍禁止提前展示 MCC、授权范围、产品开通材料或 onboarding 待办。
205
205
 
206
- 方案送达后只通过上述 development loader 进入步骤 3;loader 仍在原位置记录兼容 stage `integration.user_confirmed` 和 `integration.pre_dev_reading.start`。前者表示已基于完整确定事实自动进入执行,不表示收到额外确认回复;不得另行执行 telemetry 命令或伪造用户回复。
206
+ 方案送达后只通过上述 development loader 进入步骤 3;loader 仍在原位置记录兼容 stage `integration.user_confirmed` 和 `integration.pre_dev_reading.start`。前者表示已基于完整确定事实自动进入执行,不表示收到额外确认回复;不得另行执行 telemetry 命令或伪造用户回复。after-flow 从此后下一条用户消息开始;前置澄清、候选和方案只计 total。
207
207
 
208
208
  **方案后的上下文锁定**:已有项目保持步骤 1 前已经唯一解析的实际根目录和原有工程结构;新项目必须已经在步骤 1 前按用户明确选择的方式完成初始化并通过构建标识检查。此处不重复准备、初始化或探测项目。路径内容与步骤 1 成功时不一致则停止并重新澄清;只有目标项目或服务端语言变化时返回步骤 1,其他情况直接进入步骤 3。
209
209
 
@@ -539,32 +539,32 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
539
539
 
540
540
  先汇总 checklist 证据;本轮可修复时先修复、重检,不渲染中间结果。项目快照变化会使旧 `CHECKLIST_SCOPE_RECEIPT` 失效,必须重新加载本阶段并重跑受影响检查。
541
541
 
542
- 项目不再变化且准备生成最终结论时,按已确认产品固定映射 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY` 得到 `PRODUCT_VARIANT`。下方唯一 `checklist-result` runner 会在同一次调用中重新计算一次项目快照、校验 scope,并基于该快照执行一次固定 implementation audit;审计只读非测试生产源码并检查核心接口标记和登记的高置信度危险模式,不替代完整 checklist,也不接受 Agent 提供的审计 receipt。
542
+ 项目不再变化且准备生成最终结论时,按 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY` 得到 `PRODUCT_VARIANT`。下方唯一 runner 会重算项目快照、校验 scope,并执行固定 implementation audit;审计只读非测试生产源码,检查核心接口标记和登记的高置信度危险模式,不替代完整 checklist,也不接受 Agent 审计 receipt。
543
543
 
544
- 若审计发现问题且命令未传 `--finalize-audit-findings true`,stdout 固定为空,stderr 只接受唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_AUDIT={state:"REPAIR_REQUIRED",findings:[...]}`。本轮可修复时先修复,重新加载 checklist 阶段取得新 scope,再用更新后的实际证据重跑同一结论命令;不得渲染中间结果。确认无法在本轮修复时,向同一结论命令追加 `--finalize-audit-findings true`,由 runner 强制把结构化 findings 合入“未通过”并收口;该内部重跑不新增用户操作点。`full_process` 必须停在 Integration。
544
+ 若审计发现问题且命令未传 `--finalize-audit-findings true`,stdout 为空,stderr 只接受唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_AUDIT={state:"REPAIR_REQUIRED",findings:[...]}`。本轮可修复时先修复,重新加载 checklist 阶段取得新 scope,再用更新后的实际证据重跑同一结论命令,禁止渲染中间结果。无法修复时向同一命令追加 `--finalize-audit-findings true`,runner 将 findings 合入“未通过”并收口;该内部重跑不新增用户操作点。`full_process` 必须停在 Integration。
545
545
 
546
- 对客结论统一使用 `integration.checklist.result`;整体结论、失败/部分通过项和人工待验证项必须来自最终一轮 checklist 实际证据。首次调用前先按以下完整契约确定参数,禁止自由改写枚举:
546
+ 对客结论统一使用 `integration.checklist.result`;整体结论、失败/部分通过项和人工待验证项必须来自最终一轮 checklist 实际证据。首次调用前先按以下完整契约确定参数,禁止改枚举:
547
547
 
548
- - `variant` 固定映射 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY`;`overallResult` 只允许“通过、部分通过、未通过”。
549
- - `failedItems` 与 `manualItems` 是包含确定下一步的受控单行值,没有对应项目时传“无”。`sandboxConfigState` 直接复用本轮脚本终态,只允许 `READY|CREATE_PENDING|VERIFY_PENDING`;`blockingDefectState` 中,除沙箱配置及其直接依赖外存在代码、安全或必要依据缺口时传 `PRESENT`,否则传 `NONE`。待配置时 `failedItems` 必须列出沙箱配置及依赖动作未完成;恢复口令只由步骤 1/3 已发送的 `sandbox.configuration.pending` 正文提供。
550
- - `executionMode` 在 `integration_only` 固定为“仅代码开发”,此时 `nextFlowReminder` 固定为“正式上线前还需完成支付产品-产品开通。”。`full_process` 固定为“完整接入”:`READY` 且整体“通过”时提醒“代码开发校验通过后将自动进入支付产品-产品开通;未通过时停留在代码开发。”;沙箱待配置、整体“部分通过”且 `blockingDefectState=NONE` 时提醒“沙箱配置尚未完成,但不阻塞本轮继续支付产品-产品开通;完成配置后再进行沙箱测试。”;`READY`、整体“部分通过”、`failedItems=无` 且仅有人工待验证项时提醒“代码开发自动校验已完成,仍有人工待验证项;本轮继续产品开通。”,并把 `manualItems` 原样带入 Onboarding Step 6。其他阻断结果停在 Integration。
551
- - 只有 `AIPAY` 传 `sandboxResult`:步骤 6 实际端到端联调通过时固定为“AI 按量付费沙箱服务端联调通过”,未运行、待配置或未通过时固定为“AI 按量付费沙箱服务端联调未通过”。只有 `WEBPAY` 传 `webpayExperienceResult`:按步骤 6 实际证据从“已提供浏览器付款入口和操作指引,实际付款及结果验证仍以用户完成情况为准”“未提供浏览器付款入口或完整操作指引,需先补齐”“已提供浏览器付款入口和操作指引;用户已完成一笔沙箱付款,结果只按实际核验证据记录”中选择。`APPPAY` 不传这两个参数。
548
+ - `variant` 映射 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY`;`overallResult` 只允许“通过、部分通过、未通过”。
549
+ - `failedItems`/`manualItems` 必须是含下一步的受控单行值,无项目传“无”。`sandboxConfigState` 只允许 `READY|CREATE_PENDING|VERIFY_PENDING`;除沙箱配置及其直接依赖外存在代码、安全或必要依据缺口时 `blockingDefectState=PRESENT`,否则 `NONE`。待配置时 `failedItems` 必须列出沙箱配置及依赖动作未完成;恢复口令只由步骤 1/3 已发送的 `sandbox.configuration.pending` 正文提供。
550
+ - `executionMode`:`integration_only` 固定“仅代码开发”,`nextFlowReminder` 固定“正式上线前还需完成支付产品-产品开通。”。`full_process` 固定“完整接入”:`READY` 且“通过”时提醒“代码开发校验通过后将自动进入支付产品-产品开通;未通过时停留在代码开发。”;沙箱待配置且 `blockingDefectState=NONE` 时提醒“沙箱配置尚未完成,但不阻塞本轮继续支付产品-产品开通;完成配置后再进行沙箱测试。”;`READY`、`failedItems=无` 且仅有人工待验证项时提醒“代码开发自动校验已完成,仍有人工待验证项;本轮继续产品开通。”,并把 `manualItems` 原样带入 Onboarding Step 6。其他阻断结果停在 Integration。
551
+ - 仅 `AIPAY` 传 `sandboxResult`:步骤 6 端到端联调通过为“AI 按量付费沙箱服务端联调通过”,否则为“AI 按量付费沙箱服务端联调未通过”。仅 `WEBPAY` 传 `webpayExperienceResult`,按步骤 6 证据从三个登记值中选择:已提供入口指引且待用户实际付款、未提供完整入口指引、或用户已完成一笔沙箱付款且结果有核验证据。`APPPAY` 不传这两个参数。
552
552
 
553
553
  必须从本 flow 所在目录执行当前产品对应单行 runner;runner stdout 是唯一对客正文,必须把 stdout 原文作为当前回复正文发给用户:
554
554
 
555
555
  <!-- ALIPAY_AIPAY_PRODUCT:aipay:START -->
556
556
  ```bash
557
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant AIPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-result "$SANDBOX_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
557
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant AIPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-result "$SANDBOX_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER" --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
558
558
  ```
559
559
  <!-- ALIPAY_AIPAY_PRODUCT:END -->
560
560
  <!-- ALIPAY_AIPAY_PRODUCT:webpay:START -->
561
561
  ```bash
562
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant WEBPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --webpay-experience-result "$WEBPAY_EXPERIENCE_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
562
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant WEBPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --webpay-experience-result "$WEBPAY_EXPERIENCE_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER" --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
563
563
  ```
564
564
  <!-- ALIPAY_AIPAY_PRODUCT:END -->
565
565
  <!-- ALIPAY_AIPAY_PRODUCT:apppay:START -->
566
566
  ```bash
567
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant APPPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
567
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message checklist-result --variant APPPAY --project-path "$PROJECT_PATH" --scope-receipt "$CHECKLIST_SCOPE_RECEIPT" --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER" --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
568
568
  ```
569
569
  <!-- ALIPAY_AIPAY_PRODUCT:END -->
570
570
 
@@ -762,12 +762,12 @@ const managedEntrypoints = {
762
762
  allowedCallers: ['error_handler.sh']
763
763
  },
764
764
  'application.key.page': {
765
- command: 'node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" app key --defer-open <appId> <publicKey>,页面 stdout 独立送达后使用同一入口执行 app open-key-page <appId>',
765
+ command: 'node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" app key --product-type <aipay|webpay|apppay> --defer-open <appId> <publicKey>,页面 stdout 独立送达后使用同一入口执行 app open-key-page <appId>',
766
766
  reason: 'app.sh 校验 URL 并托管页面。',
767
767
  allowedCallers: ['app.sh']
768
768
  },
769
769
  'application.key.pending': {
770
- command: 'node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" app verify-key <appId> [publicKey] 或使用同一入口执行 app verify-key-and-audit <appId> [publicKey]',
770
+ command: 'node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" app verify-key --product-type <aipay|webpay|apppay> <appId> [publicKey] 或使用同一入口执行 app verify-key-and-audit --product-type <aipay|webpay|apppay> <appId> [publicKey]',
771
771
  reason: 'app.sh 实际查询结果。',
772
772
  allowedCallers: ['app.sh']
773
773
  },
@@ -325,7 +325,7 @@ export function enqueueMetricEvent(event, env = process.env) {
325
325
 
326
326
  function safeRunId(value) {
327
327
  if (typeof value !== 'string' || !value.trim()) return '';
328
- // Sync-log uses comma-separated columns and ^/= delimiters without value escaping.
328
+ // Run IDs also participate in state keys and param4 matching, so keep them separator-free.
329
329
  return /[\u0000-\u001f\u007f,^=]/u.test(value) ? '' : value;
330
330
  }
331
331
 
@@ -391,33 +391,40 @@ function parseBooleanFlag(value) {
391
391
  return null;
392
392
  }
393
393
 
394
- function terminalExtInfoFromPayload(payload = {}) {
394
+ function terminalExtInfoFromPayload(payload = {}, env = process.env) {
395
395
  if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return '';
396
396
  const total = parseNonNegativeInteger(payload.userInputCountTotal ?? payload.user_input_count_total);
397
397
  const afterFlowStart = parseNonNegativeInteger(
398
398
  payload.userInputCountAfterFlowStart ?? payload.user_input_count_after_flow_start
399
399
  );
400
400
  const flowStartObserved = parseBooleanFlag(payload.flowStartObserved ?? payload.flow_start_observed);
401
+ const rootIntent = rootIntentFrom(payload, env);
401
402
  if (total === null || afterFlowStart === null || flowStartObserved === null) return '';
403
+ if (!rootIntent) return '';
402
404
  if (afterFlowStart > total) return '';
403
405
  if (!flowStartObserved && afterFlowStart !== 0) return '';
404
406
  return JSON.stringify({
405
407
  user_input_count_total: total,
406
408
  user_input_count_after_flow_start: afterFlowStart,
407
- flow_start_observed: flowStartObserved
409
+ flow_start_observed: flowStartObserved,
410
+ root_intent: rootIntent
408
411
  });
409
412
  }
410
413
 
411
414
  function terminalExtInfoFromEvent(event) {
412
415
  if (event?.stage !== 'run.terminal') return '';
416
+ const withEventRoot = (payload) => terminalExtInfoFromPayload({
417
+ rootIntent: event.root_intent || event.rootIntent,
418
+ ...(payload && typeof payload === 'object' && !Array.isArray(payload) ? payload : {})
419
+ }, {});
413
420
  if (typeof event.ext_info === 'string') {
414
421
  try {
415
- return terminalExtInfoFromPayload(JSON.parse(event.ext_info));
422
+ return withEventRoot(JSON.parse(event.ext_info));
416
423
  } catch {
417
424
  return '';
418
425
  }
419
426
  }
420
- return terminalExtInfoFromPayload(event?.ext_info);
427
+ return withEventRoot(event?.ext_info);
421
428
  }
422
429
 
423
430
  export function stageMetricEvent(stage, context = {}, nowMs = Date.now(), env = process.env) {
@@ -444,7 +451,7 @@ export function stageMetricEvent(stage, context = {}, nowMs = Date.now(), env =
444
451
  const rootIntent = rootIntentFrom(context, env);
445
452
  if (rootIntent) event.root_intent = rootIntent;
446
453
  if (event.stage === 'run.terminal') {
447
- const extInfo = terminalExtInfoFromPayload(context);
454
+ const extInfo = terminalExtInfoFromPayload(context, env);
448
455
  if (extInfo) event.ext_info = extInfo;
449
456
  }
450
457
  return event;
@@ -853,10 +860,19 @@ function serializeSyncLogParam4(param4) {
853
860
  return Object.keys(param4)
854
861
  .filter((key) => param4[key] !== undefined && param4[key] !== null)
855
862
  .sort()
856
- .map((key) => `${key}=${param4[key]}`)
863
+ .map((key) => `${key}=${encodeSyncLogParam4Value(param4[key])}`)
857
864
  .join('^');
858
865
  }
859
866
 
867
+ function encodeSyncLogParam4Value(value) {
868
+ const text = String(value ?? '');
869
+ try {
870
+ return encodeURIComponent(text).replace(/'/g, '%27');
871
+ } catch {
872
+ return encodeURIComponent(text.replace(/[\uD800-\uDFFF]/g, '\uFFFD')).replace(/'/g, '%27');
873
+ }
874
+ }
875
+
860
876
  export function buildSyncLogLine(userID, param4, date = new Date()) {
861
877
  const pad = (value, length = 2) => String(value).padStart(length, '0');
862
878
  const clientLogTime = [
@@ -1,13 +1,5 @@
1
- # Skill 启动器自更新契约
1
+ # 自更新
2
2
 
3
- 首次使用 `alipay-aipay` 时,必须在读取入口、flow、模块、消息目录或业务脚本前检查一次版本,并记录 `ALIPAY_AIPAY_SELF_UPDATE_CHECKED=true`:
3
+ 首次使用 `alipay-aipay` 前检查一次版本,记录 `ALIPAY_AIPAY_SELF_UPDATE_CHECKED=true`:`node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" self-update check --skill-dir "<SKILL_DIR>"`。`<SKILL_DIR>` 是当前包含 updater 的 Skill 规范化绝对路径,不得换成启动目录、项目目录、Home、npm 源码根或其他副本;命令不得改成变量赋值、命令替换、相对路径或特定 shell 语法;不透传 npm/npx 原始输出。
4
4
 
5
- ```text
6
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" self-update check --skill-dir "<SKILL_DIR>"
7
- ```
8
-
9
- `<SKILL_DIR>` 必须是当前这份包含 updater 的 Skill 规范化绝对路径,不得换成启动目录、项目目录、Home、npm 源码根或其他副本。命令不得改成变量赋值、命令替换、相对路径或特定 shell 语法;不透传 npm/npx 原始输出。
10
-
11
- 唯一 stderr 终态:`SELF_UPDATE:CURRENT=<合法 SemVer>`、`SELF_UPDATE:UPDATED=<合法 SemVer>`、`SELF_UPDATE:RETRY_WITH_NETWORK`、`SELF_UPDATE:SKIPPED_NETWORK_RESTRICTED`、`SELF_UPDATE:CHECK_FAILED`、`SELF_UPDATE:INSTALL_FAILED`、`SELF_UPDATE:VERIFY_FAILED`。
12
-
13
- `UPDATED` 使用原子替换后的新版,其余使用当前可用版;marker 缺失、重复或不唯一时读当前入口,不得称最新或更新成功。`UPDATED` 后停止读旧版,读取同一根目录的新版入口;仅 `RETRY_WITH_NETWORK` 可取权后原样重试一次,拒绝、不支持或再次返回时读当前入口。上述一次网络恢复外,不重查、取权、用 `sudo`、要求用户操作或写更新状态。每次只查一次 npm latest;`VERSION` 缺失、非法、落后或业务入口缺失时只安装精确版本一次。不调用公开 `install --target all`;超时会终止同一次调用的进程树并恢复清理。
5
+ 唯一 stderr 终态:`SELF_UPDATE:CURRENT=<合法 SemVer>`、`SELF_UPDATE:UPDATED=<合法 SemVer>`、`SELF_UPDATE:RETRY_WITH_NETWORK`、`SELF_UPDATE:SKIPPED_NETWORK_RESTRICTED`、`SELF_UPDATE:CHECK_FAILED`、`SELF_UPDATE:INSTALL_FAILED`、`SELF_UPDATE:VERIFY_FAILED`。`UPDATED` 用原子替换后的新版,其余用当前可用版;marker 异常读当前入口,不得称最新或更新成功;停止读旧版,读取同一根目录的新版入口。仅 `RETRY_WITH_NETWORK` 可取权后原样重试一次,拒绝、不支持或再次返回时读当前入口;一次网络恢复外,不重查、取权、用 `sudo`、要求用户操作或写更新状态。每次只查一次 npm latest;`VERSION` 缺失、非法、落后或业务入口缺失时只安装精确版本一次。不调用公开 `install --target all`;超时终止同一次调用的进程树并清理。
@@ -1,6 +1,6 @@
1
- - stage、Yuyan 字段和低敏维度以 `scripts/telemetry.mjs` 与测试为准。遥测关闭、缺少 run、落盘/网络/上传失败或非 2xx 不得改变业务 stdout、退出语义或 flow 转移;内部行用 `ALIPAY_AIPAY_INTERNAL:`。
2
- - `start-run` 创建或复用当前 `run_id`;业务脚本继承 `PLATFORM_ID=<run_id>`,Agent 不手写环境变量前缀或改 MCP payload。outbox 只写用户系统临时目录,collector HTTP 2xx 后才删。维护/测试进程不复用默认 run state,默认不远端上传。Benchmark 只能用 `ALIPAY_AIPAY_TELEMETRY_CAPTURE_ONLY=1` 写样本隔离 outbox;该模式不调度 uploader,`telemetryUploadEnabled`、`flushOutbox` 和权限补传判定禁用远端上传。
3
- - 根入口用 `root_intent + product_type` 判定复用或新建;组合不变时不按时长失效,`UNKNOWN` 补全为明确产品仍复用同一 `run_id`。只有明确换产品、切换根意图或已有 run 终态才重建;用户只说“重新开始/重新走流程/作废本轮流程”但组合未变时继续复用。`COZE_PROJECT_ID`、`MEOO_PROJECT_ID`、`MIAODA` 下的 `VITE_APP_ID`/`PLATFORM_ID` 优先作为新 run ID。
1
+ - stage、Yuyan/低敏维度以 `scripts/telemetry.mjs` 与测试为准。`param4` 按 SDK 单项编码后整体编码。遥测关闭、缺 run、落盘/网络/上传/非 2xx 不改业务;内部行 `ALIPAY_AIPAY_INTERNAL:`。
2
+ - `start-run` 创建或复用当前 `run_id`;业务脚本继承 `PLATFORM_ID=<run_id>`,Agent 不手写环境前缀或改 MCP payload。outbox 写系统临时目录,collector HTTP 2xx 后才删。维护/测试不复用默认 run state,不远端上传。Benchmark 只用 `ALIPAY_AIPAY_TELEMETRY_CAPTURE_ONLY=1` 写隔离 outbox,禁上传、flush 和权限补传。
3
+ - 根入口用 `root_intent + product_type` 判定复用或新建;组合不变不按时长失效,`UNKNOWN` 补全为明确产品仍复用同一 `run_id`。只有换产品、换根意图或已有 run 终态才重建;用户只说“重新开始/重新走流程/作废本轮流程”但组合未变时继续复用。`COZE_PROJECT_ID`、`MEOO_PROJECT_ID`、`MIAODA` 下的 `VITE_APP_ID`/`PLATFORM_ID` 优先作为新 run ID。
4
4
  - `integration_only` 由 checklist 最终消息终止;`full_process` 的 Integration 收口不终止。`onboarding_only|full_process` 由 Onboarding closeout、企业账号不支持或 Windows 站点引导消息终止。查看主键只用 `current-run-id`,不得为查看而新建 run。
5
- - Agent 在当前上下文计数:`user_input_count_total` 从触发当前 `run_id` 的用户消息开始;`user_input_count_after_flow_start` 从进入 `integration.user_confirmed` 或 `onboarding.user_confirmed` 后的下一条用户消息开始;`flow_start_observed` 表示已进入正式 flow start,`full_process` 不因进入 Onboarding 重置。只计用户发给 Agent 的消息;用户直接 kill 且没有执行 `run.terminal` 时不补报。终态命令只追加 `--user-input-count-total`、`--user-input-count-after-flow-start`、`--flow-start-observed`;不得新增工具调用、确认点、stage 或独立上报。`run.terminal` 的 Yuyan `c4` 字段名为 `ext_info`,三项合法时写 minified JSON;非法、缺失、`after_flow_start > total` 或 `flow_start_observed=false` 但 after-flow 非 0 时省略 `c4`。
6
- - `telemetry upload-status` 只读内部诊断。网络类失败且 outbox 有积压时,先执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry permissioned-flush-needed`;只有内部事实为 `PERMISSIONED_FLUSH_NEEDED=true` 时才申请一次可复用联网权限运行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry flush-outbox`,同一 Agent 会话只请求一次。`flush-outbox` 只启动后台补传并立即返回;用户拒绝、后台失败或非 2xx 都保留 outbox 并继续业务。collector HTTP 结果、失败或待重试结果不得作为业务转移或完成条件。
5
+ - Agent 计数:`user_input_count_total` 从触发当前 `run_id` 的用户消息开始;`user_input_count_after_flow_start` 从方案送达并进入正式执行后的下一条用户消息开始(`integration_only/full_process`:`integration.user_confirmed`;`onboarding_only`:`onboarding.user_confirmed`)。产品/MCC 澄清或选择、项目/语言/框架补齐、项目候选和方案本身只计 total;`full_process` 不因 Onboarding 重置。`flow_start_observed` 表示已进入正式 flow start。只计用户消息;用户 kill 未终态不补报。终态命令只追加 `--user-input-count-total`、`--user-input-count-after-flow-start`、`--flow-start-observed`;不得新增工具调用、确认点、stage 或独立上报。`run.terminal` 的 Yuyan `c4` 字段名为 `ext_info`,三项计数合法且可取得 `root_intent` 时写 minified JSON;否则省略 `c4`。
6
+ - `telemetry upload-status` 只读诊断。网络失败且 outbox 积压时先执行 `telemetry permissioned-flush-needed`;仅 `PERMISSIONED_FLUSH_NEEDED=true` 时申请一次联网运行 `telemetry flush-outbox`,同一 Agent 会话只请求一次。`flush-outbox` 只启动后台补传并立即返回;拒绝、失败或非 2xx 保留 outbox。collector 结果不得作为业务条件。
@@ -59,7 +59,7 @@ Step 1: 方案规划 → Step 2: 环境检查 → Step 3: 登录授权
59
59
  环境检查、产品/MCC 澄清或方案展示前先执行平台入口。`onboarding_only` 正常由 `onboarding-bootstrap --root-intent onboarding_only` 包含本动作和 entry 加载;仅原子 fallback 或 `full_process` 衔接时执行:
60
60
 
61
61
  ```bash
62
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message platform-entry
62
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message platform-entry --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
63
63
  ```
64
64
 
65
65
  - Windows:runner 从私有 run context 取 `run_id` 生成 `platform_id`,禁止 Agent 传入或拼接;消息渲染即终结 run,送达唯一 stdout 后停止 Onboarding;`full_process` 保留 Integration 结果。
@@ -68,7 +68,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message plat
68
68
  用户明确要用企业账号通过 Skill 开通时执行下列消息并停止 Onboarding;不得主动询问账号类型,也不得从 MCC、营业执照或“公司”等描述推断。
69
69
 
70
70
  ```bash
71
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message enterprise-unsupported --variant <ONBOARDING_ONLY|FULL_PROCESS>
71
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message enterprise-unsupported --variant <ONBOARDING_ONLY|FULL_PROCESS> --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
72
72
  ```
73
73
 
74
74
  `onboarding_only` 固定 `ONBOARDING_ONLY`,`full_process` 固定 `FULL_PROCESS`。原文送达最终 stdout 后停止,不执行 Step 6 或追加收口。
@@ -121,7 +121,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message mcc-
121
121
 
122
122
  `salesCode`、`scope` 和材料要求只取“产品映射”。方案只由 `mcc-resolve-plan` 或已有唯一 MCC 时的 `onboarding-message plan-confirm` 生成,须展示产品/scope、MCC、条件材料、企业账号边界及商家平台链接;名称、编码和资质由同一表事实交叉校验,`-` 固定显示“当前类目参考表未列出”。禁止补充模板外资格或审核规则。
123
123
 
124
- 不得保留“先运行旧字符串搜索,无匹配后再临时让 Agent 猜”的两阶段流程,或重复询问已知信息。只有唯一事实通过机器校验、方案 marker 唯一且 stdout 已送达,才执行 `onboarding-execute-ready --product-type "$PRODUCT_TYPE"`;缺值、冲突或非唯一继续澄清。产品/MCC 变化时重新校验并渲染。execute loader 记录兼容 stage `onboarding.user_confirmed`,不代表新增用户回复,禁止手工上报。
124
+ 不得保留“先运行旧字符串搜索,无匹配后再临时让 Agent 猜”的两阶段流程,或重复询问已知信息。只有唯一事实通过机器校验、方案 marker 唯一且 stdout 已送达,才执行 `onboarding-execute-ready --product-type "$PRODUCT_TYPE"`;缺值、冲突或非唯一继续澄清。产品/MCC 变化时重新校验并渲染。execute loader 记录兼容 stage `onboarding.user_confirmed`,不代表新增用户回复,禁止手工上报。after-flow 从此后下一条用户消息开始;前置澄清、候选和方案只计 total。`full_process` 不在本阶段重置。
125
125
 
126
126
  <!-- ALIPAY_AIPAY_FLOW:ONBOARDING_ENTRY:END -->
127
127
 
@@ -496,17 +496,17 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message appl
496
496
 
497
497
  **完成条件**:当前登录、scope 和 MCC 必须有效;签约必须由实际查询确认为已生效;仅按量付费适用的服务分支必须复用或保存成功并取得实际 `serviceId`;应用必须达到 `ON_LINE`、应用公钥已生效且支付宝公钥已实际导出。存在失败、未知、待生效、待审核或人工配置时不得宣称产品开通完成。不维护人工完成条件数量。
498
498
 
499
- 使用 `../normal/json/customer-messages.json` 的 `process.partial_result` 消息逐分支收口,必须通过 `onboarding_message_runner.mjs closeout` 托管输出,并把 runner 完整 stdout 原文发送给用户。禁止用 Agent 手写短摘要替代、删减 `productionReadinessBlock`、删减 AI 网页应用收款限制引导或改写后续衔接;AI 网页应用收款收口缺少“【上线前有以下关键点】”和“AI 网页应用收款限制”时视为标准收口未送达,必须重新发送同一次 closeout stdout。自动重试耗尽、业务错误或查询失败且到本步骤仍未恢复的动作,统一写入对应分支结果和 `remainingActions`,只说明一次,不在收口后再次询问是否重试。必须执行:
499
+ 使用 `../normal/json/customer-messages.json` 的 `process.partial_result` 逐分支收口,必须通过 `onboarding_message_runner.mjs closeout` 托管输出并原文发送 stdout。禁止 Agent 手写短摘要、删减 `productionReadinessBlock`、删减 AI 网页应用收款限制引导或改写后续衔接;AI 网页应用收款收口缺少“【上线前有以下关键点】”和“AI 网页应用收款限制”时视为标准收口未送达,必须重发同一次 stdout。自动重试耗尽、业务错误或查询失败且仍未恢复的动作,统一写入分支结果和 `remainingActions`,只说明一次,不在收口后追问是否重试。必须执行:
500
500
 
501
501
  `SIGNING_RESULT`、`SERVICE_RESULT`、`APPLICATION_RESULT` 和 `INTEGRATION_RESULT` 必须使用消息目录允许的状态枚举原文,禁止拼接 `appId`、公钥文件路径、错误码、截图证据或其他自由文本;支付宝公钥保存路径只允许在已取得唯一 `ALIPAY_PUBLIC_KEY_EXPORT_STATUS=EXPORTED` 和 `ALIPAY_PUBLIC_KEY_FILE` 时,通过 `APP_KEY_SAVE_PATH` 或 `APPLICATION_OPERATION_APP_KEY_SAVE_PATH` 独立传入结果 runner。这些证据不能污染分支结果枚举。
502
502
 
503
503
  ```bash
504
- node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message closeout --product-type "$PRODUCT_TYPE" --root-intent "$ROOT_INTENT" --signing-result "$SIGNING_RESULT" --application-result "$APPLICATION_RESULT" --remaining-actions "$REMAINING_ACTIONS" [--integration-result "$INTEGRATION_RESULT"] [--service-result "$SERVICE_RESULT"] [--sandbox-config-state "$SANDBOX_CONFIG_STATE"] [--manual-verification-items "$MANUAL_VERIFICATION_ITEMS"] [--application-operation-app-id "$APPLICATION_OPERATION_APP_ID" [--application-operation-next-action "$APPLICATION_OPERATION_NEXT_ACTION"] [--application-operation-app-key-save-path "$APPLICATION_OPERATION_APP_KEY_SAVE_PATH"]]
504
+ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message closeout --product-type "$PRODUCT_TYPE" --root-intent "$ROOT_INTENT" --signing-result "$SIGNING_RESULT" --application-result "$APPLICATION_RESULT" --remaining-actions "$REMAINING_ACTIONS" [--integration-result "$INTEGRATION_RESULT"] [--service-result "$SERVICE_RESULT"] [--sandbox-config-state "$SANDBOX_CONFIG_STATE"] [--manual-verification-items "$MANUAL_VERIFICATION_ITEMS"] [--application-operation-app-id "$APPLICATION_OPERATION_APP_ID" [--application-operation-next-action "$APPLICATION_OPERATION_NEXT_ACTION"] [--application-operation-app-key-save-path "$APPLICATION_OPERATION_APP_KEY_SAVE_PATH"]] --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>
505
505
  ```
506
506
 
507
- runner 从 `PRODUCT_TYPE` 唯一派生产品名,网站支付/APP 支付唯一派生服务结果“无需处理”,并从 `ROOT_INTENT` 派生代码开发栏和既有后续衔接;总结果标题只按下方完成条件派生。`onboarding_only` 省略 `--integration-result`、`--sandbox-config-state` 和 `--manual-verification-items`。`full_process` 中,代码开发全部通过时填“已完成”并传 `READY`;只有沙箱待配置且其余代码与安全检查通过时填“部分完成,沙箱配置待完成”,并原样传 `CREATE_PENDING|VERIFY_PENDING`;沙箱为 `READY` 且代码开发只剩非阻塞人工待验证项时填“部分完成,人工待验证”,传 `READY`,把代码开发 checklist 的 `manualItems` 原样作为 `MANUAL_VERIFICATION_ITEMS` 传入,并在 `REMAINING_ACTIONS` 中写明“完成下方人工待验证项”或同等实际待办,禁止传“无”。runner 只接受上方紧凑参数,拒绝旧完整参数、stdin JSON、`--input-json`、可派生字段和空字符串伪值。renderer 会校验结果与沙箱状态、人工待验证项一致,并派生恢复口令或人工待验证展示行;该展示不增加确认点或用户回复要求。不得在其 stdout 前后单独追加衔接提醒,不伪造本轮代码修改、沙箱创建或测试结果,也不重复进入 integration。
507
+ runner 从 `PRODUCT_TYPE` 派生产品名,网站支付/APP 支付派生服务结果“无需处理”,从 `ROOT_INTENT` 派生代码开发栏和后续衔接;标题只按完成条件派生。`onboarding_only` 省略 `--integration-result`、`--sandbox-config-state` 和 `--manual-verification-items`。`full_process`:代码开发通过填“已完成”并传 `READY`;仅沙箱待配置且其余代码与安全检查通过填“部分完成,沙箱配置待完成”并传 `CREATE_PENDING|VERIFY_PENDING`;沙箱 `READY` 且只剩非阻塞人工待验证项时填“部分完成,人工待验证”,传 `READY`,把 checklist `manualItems` 原样作为 `MANUAL_VERIFICATION_ITEMS`,并在 `REMAINING_ACTIONS` 写明实际待办,禁止传“无”。runner 拒绝旧完整参数、stdin JSON、`--input-json`、可派生字段和空字符串伪值。renderer 校验结果与沙箱状态/人工待验证项一致,并派生恢复口令或人工待验证展示;不增加确认点。不得在 stdout 前后追加衔接提醒,不伪造本轮代码修改、沙箱创建或测试结果,也不重复进入 integration。
508
508
 
509
- 若 `full_process` 最后一跳紧接着应用创建、审核提交或复用结果,不再单独输出一条 `application.operation.result` 后又立刻输出本收口消息;只记录同一 `APPLICATION_OPERATION_APP_ID`,runner 直接复用 `APPLICATION_RESULT` 作为实际状态;非“需人工配置”结果还必须记录下一步 `APPLICATION_OPERATION_NEXT_ACTION`。“需人工配置”的下一步由 closeout runner 从消息目录派生,禁止 Agent 传入。若同一动作已成功导出支付宝公钥,则同时传入 `APPLICATION_OPERATION_APP_KEY_SAVE_PATH`,收口必须展示“当前 appId: xxx 对应的支付宝公钥保存在:xxx”;“需人工配置”禁止传该路径。应用结果已为“已上线且配置完整”且没有保存路径时不再展开“应用分支结果”,由结果表和上线前检查块承接;已上线且有保存路径时只展开 appId、实际状态和保存路径;待审核、待设置公钥、需人工配置、失败或结果未知时合并展示为“应用分支结果”并保留完成态红线。`onboarding_only`、应用分支仍需等待用户补材料/确认,或应用操作结果不是紧邻 Step 6 最终收口时,仍按应用模块原规则输出 `application.operation.result`。合并展示不得改写应用完成条件,待审核、待设置公钥或待人工配置时仍不得表述为应用发布完成。
509
+ 若 `full_process` 最后一跳紧接应用创建、审核提交或复用,不再先输出 `application.operation.result` 再立刻 closeout;只记录同一 `APPLICATION_OPERATION_APP_ID`,runner 复用 `APPLICATION_RESULT`,非“需人工配置”还记录 `APPLICATION_OPERATION_NEXT_ACTION`;“需人工配置”的下一步由 runner 派生。若同一动作已成功导出支付宝公钥,同时传 `APPLICATION_OPERATION_APP_KEY_SAVE_PATH`,收口必须展示“当前 appId: xxx 对应的支付宝公钥保存在:xxx”;“需人工配置”禁止传该路径。已上线且无保存路径时不展开“应用分支结果”;已上线且有保存路径时只展开 appId、状态和路径;其他应用结果合并展示并保留完成态红线。`onboarding_only`、应用分支仍需用户补材料/确认,或应用操作结果不是紧邻 Step 6 收口时,仍按应用模块输出 `application.operation.result`。合并展示不得改写完成条件,待审核、待设置公钥或待人工配置仍不得表述为应用发布完成。
510
510
 
511
511
  当且仅当签约结果为“已提交,等待生效”且应用结果为“已提交审核,等待上线”时,renderer 从消息目录自动在 `remainingActions` 后追加状态查询提示;该提示不是 flow 入参,Agent 禁止自行传入、拼接或在模板外重复输出。其他结果组合不展示该提示。
512
512
 
@@ -16,7 +16,7 @@ AI 网页应用收款覆盖 PC 网页和手机浏览器/H5,接口固定 `alipa
16
16
  7. **沙箱结论**:真实快速沙箱配置不得用占位值,唯一例外是 AI 按量付费沙箱 `service_id=api_mock_service_id`,且生产禁用。`CREATE_PENDING|VERIFY_PENDING` 只允许继续代码实现,阻止字段使用、摘要、后置校验、联调和付款体验。字段校验不等于支付测试;仅完整 402 链路满足 flow 才可称沙箱测试通过。
17
17
  8. **异步通知**:AI 网页应用收款/AI 移动应用收款必须实现通知。本地无公网 HTTPS `notify_url` 时可不传并以交易查询验收,公网通知联调列为人工待验证;生产上线前须恢复通知并完成验签、幂等、关键字段校验、`success` 回写和补偿查询,否则不宣称生产就绪。
18
18
  9. **受控页面**:授权链接仅由 `auth.sh` 按固定产品/MCC 生成,只允许 `https://aipay.alipay.com/cli-auth` 及登记参数,禁用 CLI `verification_url`;公钥页和系统 opener 只走登记脚本。失败后宿主内置浏览器只可打开已交付的同一 URL 一次;仍失败才提示手动打开,再有限轮询。禁止搜索、改写或自动操作;opener/config 写失败不算业务失败。
19
- 10. **对客输出**:指定 runner/renderer/脚本时,stdout 是唯一对客正文,须原文回复且不加旁白;工具输出记录、折叠面板或日志不等于已对客发送。展示命令只执行登记的单条命令,禁止追加 `2>&1`、管道、`grep/sed/awk/tee`、临时包装或拆回 `jq/printf/renderer`。除 `self_update.mjs` 的 `SELF_UPDATE:*` stderr 终态外,内部事实行均以 `ALIPAY_AIPAY_INTERNAL:` 开头;宿主合并输出时仍整行剔除,严禁对客。`integration.start.confirm` 和 `onboarding.plan.confirm` 成功时必须各自产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=<messageId>`;下一动作必须将 stdout 正文作为可见进行中消息原文送达,不得以最终答复结束回合,送达前禁用工具。工具面板、内部思考或声称“已展示”都不满足交付;送达后同一回合立即执行 flow 指定的下一工具,不等待回复或确认。所有 `postRenderHintType=scanReturn` 的页面消息都是交付屏障(当前为 `auth.page`、`application.key.page`):先独立送达页面 stdout,再执行受控 opener 和有限轮询,不把后续待完成或收口消息合并发送;屏障不要求确认或新增操作。阻塞正文后等待;剔除内部行后正文为空则直接转移,不补话术。
19
+ 10. **对客输出**:指定 runner/renderer/脚本时,stdout 是唯一对客正文,须原文回复且不加旁白;工具输出记录、折叠面板或日志不等于已对客发送。展示命令只执行登记单条命令,禁 `2>&1`、管道、`grep/sed/awk/tee`、临时包装或拆回 `jq/printf/renderer`。除 `self_update.mjs` 的 `SELF_UPDATE:*` stderr 终态外,内部事实行均以 `ALIPAY_AIPAY_INTERNAL:` 开头;宿主合并输出时仍整行剔除,严禁对客。`integration.start.confirm` 和 `onboarding.plan.confirm` 成功时必须各自产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=<messageId>`;下一动作先将 stdout 可见送达,不得以最终答复结束回合,送达前禁工具;送达后同回合继续,不等待回复。所有 `postRenderHintType=scanReturn` 的页面消息都是交付屏障(当前为 `auth.page`、`application.key.page`):先独立送达页面 stdout,再执行受控 opener 和有限轮询,不合并 pending/收口;不要求确认。阻塞正文后等待;剔除内部行后正文为空则直接转移。
20
20
  11. **确定性转移**:固定脚本终态后立即转移;只执行动作处登记命令,禁止追加 `jq/cat/grep/curl` 或临时脚本重复解析。失败只走登记恢复;项目自检不绕过 Skill 脚本或打印敏感配置。
21
21
 
22
22
  ## 标准消息
@@ -41,20 +41,20 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" render <messageId> --va
41
41
  | 意图 | 判定 | 入口 | 后续按需加载 |
42
42
  |---|---|---|---|
43
43
  | `integration_only` | 只要求代码开发、支付集成或集成排障,未同时要求产品开通 | 执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-bootstrap --root-intent integration_only` | 当前阶段、产品和语言的契约、示例与脚本 |
44
- | `onboarding_only` | 只要求签约、入驻或产品开通,未同时要求代码开发 | 执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-bootstrap --root-intent onboarding_only` | 当前阶段的授权、查询或写分支模块 |
44
+ | `onboarding_only` | 只要求签约、入驻或产品开通,未同时要求代码开发 | 执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-bootstrap --root-intent onboarding_only --user-input-count-total <total> --user-input-count-after-flow-start <afterFlowStart> --flow-start-observed <true|false>` | 当前阶段的授权、查询或写分支模块 |
45
45
  | `full_process` | 明确要求完整接入、一站式,或同一请求同时要求代码开发和产品开通 | `normal/full-process-routing.md` | 先 Integration,满足衔接条件后 Onboarding |
46
46
 
47
47
  `integration_only` 的 `integration-bootstrap` 只在同一 Node 进程串行执行 `telemetry start-run` 与 `flow integration entry`。`onboarding_only` 的 `onboarding-bootstrap` 只串行执行 `telemetry start-run`、`onboarding-message platform-entry` 与 `flow onboarding entry`。两者均为既有无业务写入动作,执行后不得重复原子命令。Windows 引导渲染即终结 run 并停止,`platform_id` 取本次 `run_id` 且禁止 Agent 传入;非 Windows 返回 entry 契约。`full_process` 不使用 `integration-bootstrap`;衔接 Onboarding 也不使用带 `start-run` 的 bootstrap,仍执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message platform-entry` 后按需加载 entry,避免重复 `run.intent_detected`。
48
48
 
49
49
  `full_process` 识别根意图后立即执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry start-run --root-intent full_process`;产品已唯一确定时追加 `--product-type <aipay|webpay|apppay>`。`integration_only` 和 `onboarding_only` 已由上表各自 bootstrap 包含同一次 `start-run`,不得重复执行本条 telemetry。命令创建/复用当前流程 `run_id`,并在遥测开启时记录 `run.intent_detected`:同一意图和产品继续复用,`UNKNOWN` 补全产品仍复用同一 `run_id`;明确换产品、换根意图或既有 run 已终态才重建。第三方平台项目 ID 仍优先固定为 `run_id`,不得被显式 run ID 或本地生成值覆盖。业务 stage 只由登记 runner/script 异步记录。
50
50
 
51
- 遥测默认开启,`ALIPAY_AIPAY_TELEMETRY=0|false|off|no` 可关闭 `METRIC_EVENT`、outbox、上传和 flush;私有流程 run context 仍用于 `PLATFORM_ID` 和终态生命周期。落盘/网络/上传/flush 失败静默,不改变业务、消息或确认,stdout 为空且 stderr 内部行不对客。`integration_only` 由 checklist 终结;Onboarding 由 closeout 或登记的提前终止消息终结。Agent 按 `normal/telemetry.md` 维护本轮用户输入计数,并只在终态命令追加可选参数,不新增工具调用、确认点或独立上报。脚本始终以当前流程 `run_id` 为 `PLATFORM_ID`,Agent 不手写环境前缀或改 MCP payload;维护诊断、outbox、上传和 flush 细节只在 `normal/telemetry.md` 按需读取。
51
+ 遥测默认开启,`ALIPAY_AIPAY_TELEMETRY=0|false|off|no` 可关闭 `METRIC_EVENT`、outbox、上传和 flush;私有流程 run context 仍用于 `PLATFORM_ID` 和终态生命周期。落盘/网络/上传/flush 失败静默,不改变业务、消息或确认,stdout 为空且 stderr 内部行不对客。`integration_only` 由 checklist 终结;Onboarding 由 closeout 或登记的提前终止消息终结。Agent 按 `normal/telemetry.md` 维护本轮用户输入计数,并只在终态命令追加可选参数,不新增工具调用、确认点或独立上报。after-flow 以方案后 `*.user_confirmed` 为起点;前置澄清和候选选择不计入。脚本始终以当前流程 `run_id` 为 `PLATFORM_ID`,Agent 不手写环境前缀或改 MCP payload;维护诊断、outbox、上传和 flush 细节只在 `normal/telemetry.md` 按需读取。
52
52
 
53
53
  三种入口均只在无法从已有产品名称或业务描述可靠确定唯一产品时执行 flow 登记的 `product-clarify` runner;不得推定或手写澄清。产品明确但 MCC 尚无检索输入时使用 `mcc-clarify`;已有经营描述后先按 Onboarding flow 读取一次当前 `<SKILL_DIR>/references/onboarding/modules/mcc-reference.md` 做 Agent 语义候选,再统一调用 `mcc-resolve-plan` 由 runner 复核、合并和渲染;用户直接提供当前表内完整 MCC 编码时可跳过 Agent 泛化并由 runner 精确校验。不得拆回 `mcc-search + mcc-candidates`、先旧检索失败后临时猜测,或为方案展示再拼 renderer 输入。
54
54
 
55
55
  代码开发或完整接入缺项目位置/服务端语言时,使用 `integration.context.required` 或 `integration.project_path.required` 标准消息;框架缺失不触发补问。先区分新建与复用并保留原始 `PROJECT_INPUT`。明确新建产物固定用 `resolve-project --intent new`;含名称或位置时由 Agent 解析 `TARGET_PROJECT_PATH` 并传 `--target-path`,runner 只校验路径和目录状态,不解析自然语言或把原话当目录名;纯默认新建才省略。现有项目未知时先定位候选;所有路径经 `resolve-project` 后再用 `framework-resolve`:新项目取语言默认框架,现有项目从依赖推导或沿用结构,用户明确框架优先。补齐前不初始化、装依赖或改文件。
56
56
 
57
- 每轮代码开发只渲染一次非阻塞 `integration.start.confirm`,覆盖步骤 1 至步骤8:代码开发校验;对应 `CUSTOMER_MESSAGE_DELIVERY_REQUIRED` marker 唯一且 stdout 可见送达后,直接进入步骤 3,不生成或复验方案 receipt。`full_process` 在方案展示前已完成步骤 1。Onboarding 只保留一次非阻塞方案展示;同样只有 marker 唯一且 stdout 已可见送达,才允许在 MCC 唯一事实有效后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-execute-ready --product-type "$PRODUCT_TYPE"`。该组合动作只串行加载 `flow onboarding execute` 并执行既有 `env check`,不跨用户输入、授权页或任何写操作;执行后不得再重复单独加载 execute phase 或重复环境检查。两类方案送达后都自动继续,不等待回复。服务修改仍保留绑定当前摘要的阻塞确认。签约材料完整后直接提交,服务创建摘要后直接创建,新建应用公钥校验成功后直接提审。
57
+ 每轮代码开发只渲染一次非阻塞 `integration.start.confirm`,覆盖步骤 1 至步骤8:代码开发校验;对应 `CUSTOMER_MESSAGE_DELIVERY_REQUIRED` marker 唯一且 stdout 可见送达后,直接进入步骤 3,不生成或复验方案 receipt。after-flow 起点:`full_process=integration.user_confirmed` 且 Onboarding 不重置,`onboarding_only=onboarding.user_confirmed`,前置澄清/方案不计。Onboarding 只保留一次非阻塞方案展示;同样只有 marker 唯一且 stdout 已可见送达,才允许在 MCC 唯一事实有效后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-execute-ready --product-type "$PRODUCT_TYPE"`。该组合动作只串行加载 `flow onboarding execute` 并执行既有 `env check`,不跨用户输入、授权页或任何写操作;执行后不得再重复单独加载 execute phase 或重复环境检查。两类方案送达后都自动继续,不等待回复。服务修改仍保留绑定当前摘要的阻塞确认。签约材料完整后直接提交,服务创建摘要后直接创建,新建应用公钥校验成功后直接提审。
58
58
 
59
59
  扫码页非阻塞:授权最多 12 次/间隔 5 秒,公钥最多 20 次/间隔 2 秒,成功即推进;耗尽后经统一回复判定只查一次,不重启轮询。
60
60