Files
2026-09-21 16:44:09 +08:00

120 KiB
Raw Permalink Blame History

当前系统全量功能测试计划(单节点 native browser;抖音主流程与小红书读取)

1. 基线、目标与执行边界

  • 源码基线:已同步的 main / origin/mainHEAD 7e3808cf4ce453b3583079680a3b59ca2ed64ad4。本文件是测试计划;已执行项目和真实平台阻塞项目以 验证记录 为准。
  • 目标:验证当前页面、公开 API、host-native browser gateway、持久数据及实际抖音链路;以当前源码为准,不将 docs/plan01.md 的未实现目标列为既有功能。
  • 自动检查和本地 native gateway smoke 已执行并记录;真实平台、代理、LAN、Profile 占用和破坏性资源用例仍须后续由授权操作者逐项执行。下文未执行项目不得以测试替身或内部函数补齐。
  • 排除:小红书全部业务测试;未实现的自动密码登录、真实文章/视频发布、自动聊天、附件发送、运营工作台新建私信会话、永久删除账号/环境/出口、RBAC/多租户及性能压测。公众号/快手仅覆盖现有通用账号建档,不测试其采集或平台动作。
  • 不排除:已有代码但尚无真实验收证据的抖音读取、通知监听、点赞、回复、关注、私信、素材处理。外部条件不具备时标“阻塞”,不得改为“不适用”以提高通过率。

1.1 测试层级

标记 含义 可证明 / 不可证明
UI 真实页面→控制面→数据库/实际运行资源 页面与服务闭环;单独不证明平台写入成功
API 用真实 HTTP 访问没有页面的接口或补充校验 API 契约与持久化;人工导入数据不是采集/监听 E2E
REAL 测试平台账号→真实浏览器/gateway→控制面→页面,再对照平台 真实平台端到端;必须有账号、目标和逐项写授权
MOCK 现有 Phase A Mock 执行接口 仅证明离线草稿/任务/审计链,不证明实际发布
FAULT 在隔离测试系统真实断网、停服务、撤销资源或浏览器请求阻断 故障处理;使用浏览器响应替换时只能证明 UI 防御,单独标为“UI 注入”

每条用例的“预期”是通过标准,不是已通过声明。已有缺陷也保留检查项;证实缺陷应记失败,不能因“代码就是这样”记通过。明确不支持的动作以拒绝和不产生副作用作为当前边界验收,不宣称其正向业务可用。

1.2 核对来源与纠偏

主要来源:web/src/app/main.jsxweb/src/shared/api/dataProvider.jsweb/src/features/**/*.jsxweb/src/app/Layout.jsxweb/src/shared/ui/ui.jsxinternal/controlplane/{app,api,workers}/*.gointernal/creator/{models,accounts,actions,collection,content,metrics,rules,settings,bailian}.gointernal/environment/{environment,fingerprint}.gointernal/platform/douyin/creator_collector.gobrowser_gateway/{server,http.py,platform,douyin.py,proxy.py,runtime.py}compose.yamlcompose.dev.yamlDockerfiledeploy/

其他运行文档只作操作参考:其中“代理仅凭据引用”“仿写自动生成”“抖音仅首批读取”等旧表述不能覆盖当前路由和源码。当前出口表单/API 接收用户名与密码,列表/详情会明文展示;证据必须脱敏。仿写确认只保存要求与确认时间,没有 AI 生成调用或按钮decodeCreator 直接读 JSON body,不依据 Content-Type 选择解码,故保存仿写缺 header 不等于已经证实失败。

2. 前置条件与数据账本

2.1 环境

  1. 使用专用、可销毁的 Linux 主机;gateway 以非 root systemctl --user 服务运行。禁止与现有业务共用固定 browser alias、Profile 目录或数据库 schema;不得删除现有 Docker PostgreSQL 之外的业务服务。
  2. 由执行负责人按 docs/deployment.md 准备控制面/PostgreSQL Compose 与 host-native gateway,记录构建提交、gateway 运行时配置、systemd/Xvfb/操作系统、数据库版本、时区、测试起止 UTC;另用独立时段验证 compose.dev.yaml 的开发入口。不得一边测试一边自动升级源码。
  3. 准备 curljq、必要时 Docker CLI(仅用于 PostgreSQL Compose)、systemctl --user、浏览器 DevTools;媒体核验使用宿主机 ffprobe/ffmpeg。gateway 宿主机必须有可执行的默认浏览器配置;缺失配置由 gateway 明确拒绝。
  4. 配置必须来自测试凭据保管渠道:CONTROL_PLANE_USERNAMECONTROL_PLANE_PASSWORD、32 字节 Base64 CREATORHUB_CREDENTIAL_MASTER_KEYGATEWAY_TOKEN。gateway 还需合法 BROWSER_STATE_DIRBROWSER_PROFILE_ROOTNODE_ID。不得将实际密码、Cookie、token、证件号贴入文档/缺陷/日志截图。
  5. 记录控制面 LISTEN_ADDRWEB_DIRDATABASE_URLCREATORHUB_CREDENTIAL_STORE_DIRLOG_LEVELgateway 的 LISTEN_ADDRBROWSER_STATE_DIRBROWSER_PROFILE_ROOTNODE_ID 和宿主机运行时配置。媒体目录 CREATOR_MEDIA_DIR 可写;如测转写,CREATOR_TRANSCRIPTION_BIN 必须是已安装的真实供应商适配程序,接受音轨路径参数、stdout 输出正文;不能用 echo 冒充真实转写。
  6. 如测 AI:准备已审批的 Bailian 账号、配额、BAILIAN_API_KEY,可选 BAILIAN_BASE_URL;页面 provider 填 bailian,model 填实际批准模型。勾选“已完成审批”并不验证密钥。转写页面元数据也不替代可执行程序配置。
  7. 对所有代理协议 http/https/socks4/socks5 分别准备真实可控测试端点;至少一个无认证端点、一个带认证端点、两个不同公网 IP、一个不可达端点,保存实际地区与供应商定义。没有某协议服务时该行阻塞,不能用另一协议代替。
  8. 记录观察窗口:普通 API 30 秒;创建/启停 gateway runtime 最多按控制面 11 分钟预算;运行租约调和每 20 秒、采集调度每 30 秒、监听绑定调和每 10 秒;事件长等待至多 25 秒,重连退避 1–30 秒。超时记录请求/日志,不自动重复写。

2.2 账号、目标与数据

代号 前置数据与用途
RUN 每轮唯一标记,如 e2e-20260913-01;名称、草稿和测试消息带此标记
A / B 两个抖音测试大号;平台 UID 是真实数字 UID,另记录 sec_user_id,不混用内部账号 ID
S1 / S2 两个同平台小号;测试前仅绑定一个大号,业务正常、已授权;真实动作需有效浏览器登录
U1 / U2 两个已同意的互动方/收件方测试账号;用于事件、冷却与收件箱核对
C 已同意的竞品测试账号,必须与采集执行账号不同;有可人工核对的近期/历史作品、分页及一级评论
W / K 从真实采集得到的内部作品 ID / 评论 ID;另存平台 work_key/comment_key、作者 UID、原页面链接和时间证据
M1 / M2 / M3 有明确授权的带语音视频、无音轨视频、音轨无语音视频;保存原片时长与参考文稿,不把网页 HTML 当媒体
G / V1 / V2 测试网关名和 gateway 宿主机运行时配置
E0 / E1 / P1 / P2 直连环境、代理环境、两个已健康出口;每个环境固定不同账号
T / D / Q / AT 本轮生成的任务、草稿、确认、Attempt ID;不得拿旧轮次同名结果充数

真实登录前置的特别限制POST /api/creator/accounts/:id/login-result 明确拒绝 logged_in;新建资料默认 unknown,采集/监听/人工写前置又依赖 logged_in。先执行 AC-06 核验当前可达的真实身份闭环;若人工登录浏览器后控制面仍不能形成已验证状态,记录首次登录链路阻塞。可以在有来源证明的既有真实已验证账号上继续独立用例,但必须保留新账号失败,不能 SQL 改 login_status、导入假登录结果或调用内部 Go 函数补齐。

2.3 写授权单

执行 REAL 写操作之前,审批单逐项记录:RUN、发送账号、收件 UID、作品/评论标识、动作、完整文案或已批准候选/AI 要求、允许次数、可执行时段、平台清理方式和批准人。自动策略授权与人工逐次确认分开;六种动作各自授权,不因批准“测试”就无限发送。平台验证码/设备验证由账号所有者人工完成,不自动破解。

发生 uncertain、连接中断、超时或“已发出但响应未知”:立刻停止该操作,保存原 idempotency_key,先只读查询操作记录及平台目标,不换 key、不换小号补发。只有确认未执行且得到再次授权才可另行人工处理。明确失败也不允许后台自动重试;已完成点赞/关注不要通过“再点一次”变成取消。

3. 执行入口、请求约定与故障方法

3.1 入口约定

  • UI 地址使用 HashRouterBASE/#/accounts,关联审计例 BASE/#/audit?task_id=T。生产同源静态页面也受 HTTP Basic 保护,浏览器可能先弹原生认证框;开发 Vite 入口 /login 的表单另经 API 验证。不要把两层认证混为一体。
  • 下文 API 路径均含 /api,除 /healthzGET 无 bodyPOST/PUT 示例一律 JSON;省略 body 的显式动作不要求人为增加 JSON。
  • {A} 等路径占位换成本轮账本的 URL 编码真实 ID;JSON 内 "A" 等也是占位,须替换。API_* 文件只存测试数据;敏感 body 文件放仓库外权限 0600,证据另存脱敏版本。
  • 公共调用样例(仅后续执行;不加 --retry):
# BASE、API_AUTH_FILE 由测试负责人设置;API_AUTH_FILE 是仓库外 0600 curl 配置,含测试 Basic user。
curl --silent --show-error --config "$API_AUTH_FILE" \
  --dump-header "$EVIDENCE/headers.txt" --output "$EVIDENCE/body.json" \
  --write-out '%{http_code}\n' "$BASE/api/creator/works?platform=douyin"
curl --silent --show-error --config "$API_AUTH_FILE" \
  -X POST -H 'Content-Type: application/json' --data-binary @"$BODY_FILE" \
  --dump-header "$EVIDENCE/headers.txt" --output "$EVIDENCE/body.json" \
  --write-out '%{http_code}\n' "$BASE/api/creator/operations"

每次调用使用独立证据目录;不要将一次响应覆盖上一条。响应、截图和日志都需移除认证头与代理凭据。gateway Bearer 另用 0600 curl 配置;Compose 基础部署不发布 8081,可由执行人员通过已批准的容器内 HTTP 客户端调用,或使用独立的开发部署映射端口,不能假定外网可访问。

3.2 可复用故障操作(每次只注入一种;恢复后再继续)

编号 注入方法 观察与恢复
F1 浏览器请求失败 DevTools → Network request blocking 添加准确 URL(如 */api/creator/rules*),启用后刷新对应页;网络断开用 Network Offline 记录报错、写请求数;取消规则/恢复 Online,只刷新读取;不能把页面断网当后端平台失败
F2 慢响应/页面竞争 DevTools Network 选 Slow 3G、勾 Preserve log,快速切账号/素材/会话并观察完成顺序 恢复 No throttling;若没有形成倒序响应,记该竞争子项未触发,不宣称已验证
F3 gateway 故障 专用主机执行 systemctl --user stop creatorhub-browser-gateway.service;持久化错误场景可在生命周期操作已发出时停止,记时刻 读取控制面错误/审计/cleanup 状态;systemctl --user start creatorhub-browser-gateway.service,先查询 runtime 实物和 generation,再按提示显式恢复。不得重发真实平台动作
F4 控制面中断 在目标 operation 为 processing 时执行 docker compose stop creator-hub;崩溃专项才使用 docker compose kill -s SIGKILL creator-hub docker compose start creator-hub,记录自动重启竞争;只读核对旧操作、租约及平台结果;不重复 execute。优雅与强杀分别记录
F5 PostgreSQL 故障 docker compose stop postgres,发一次指定读取/保存;记录是否已发出保存请求 docker compose start postgres,待 pg_isready 后重读;不盲目补写。数据库不可用使多个后台报错是预期故障影响
F6 实际代理断连 对专用测试代理容器 docker stop "$TEST_PROXY_CONTAINER"(先核验其归属);或使用供应商已批准的暂停端点动作 显式检测出口/访问测试目标,确认未回退直连;docker start "$TEST_PROXY_CONTAINER" 或恢复供应商端点后重新检测健康
F7 实际浏览器丢失/断线 先核验 systemctl --user 中 alias 对应的 browser/Xvfb unit 和 runtime metadata,再只停止或强杀该 runtime 的 unit;不得删除 Profile 目录 观察后台调和及动作审计;控制面重新启动环境,不直接复用旧 generation;确认 Profile 仍在
F8 媒体本地故障 专用测试部署中,读取已选素材 video_reference 并核验属于 RUN;停止 control-plane 后由负责人将该文件重命名为 .e2e-backup,再启动并 process;或对下一条全新素材临时撤掉真实转写程序配置 记录原文件/配置;停止控制面,按原路径恢复备份/原 CREATOR_TRANSCRIPTION_BIN 并重建该服务;清除临时文件。禁止修改 step 状态冒充成功;不存在可安全操作的独立目录则阻塞
F9 服务启动配置 不动运行中服务,用 control-plane 的一次性裸启动或 systemd-run --user --wait gateway 进程验证预校验会失败的变量;仅对预校验会失败的变量使用 校验失败应无新监听、无新 Profile/runtime/数据库副作用;进程退出即恢复。不将有效未知配置指向真实环境
F10 UI 异常响应 浏览器 Local Overrides 对指定 GET 保存脱敏副本,仅改待测字段,例如任务 hold_reasonallowed_action;记录原响应与改动 仅作 UI 注入,不算服务端 E2E;禁止用该响应点击实际执行/恢复写按钮,观察禁用状态即可;关闭 Overrides 并重新读取

F8 的可执行操作补充(只供后续获准的专用部署;SOURCE_PATH必须由本轮material.video_reference定位到媒体目录下的普通文件,人工核对不是目录/其他账号文件;操作时无其他素材处理):

# 移走本轮source以验证“已记录下载成功但实际文件缺失”的恢复。
docker compose stop creator-hub
docker compose run --rm --no-deps --entrypoint /bin/sh creator-hub \
  -c 'test -f "$1" && test ! -e "$1.e2e-backup" && mv "$1" "$1.e2e-backup"' sh "$SOURCE_PATH"
docker compose start creator-hub
# 此时按MAT-04只发一次process并留证。恢复原文件:
docker compose stop creator-hub
docker compose run --rm --no-deps --entrypoint /bin/sh creator-hub \
  -c 'test -f "$1.e2e-backup" && mv "$1.e2e-backup" "$1"' sh "$SOURCE_PATH"
docker compose start creator-hub

撤掉转写程序配置的独立分支:先在执行终端私密保存已验证的原值 ORIGINAL_TRANSCRIPTION_BIN;执行 CREATOR_TRANSCRIPTION_BIN= docker compose up -d --no-deps --force-recreate creator-hub,对一条全新带音轨素材执行MAT-04;留证后执行 CREATOR_TRANSCRIPTION_BIN="$ORIGINAL_TRANSCRIPTION_BIN" docker compose up -d --no-deps --force-recreate creator-hub 恢复,并核对健康与设置。只改页面转写provider/model不会让服务进程中的二进制消失,不能用来替代此故障分支。

OP-08的UI注入在浏览器Console执行 Object.defineProperty(crypto, 'randomUUID', {value: undefined, configurable: true}); Object.defineProperty(crypto, 'getRandomValues', {value: undefined, configurable: true});,整页刷新恢复;如果浏览器禁止覆写则记录未触发,不安装不受控扩展。

外部媒体下载 403/超时、平台限流/验证码、供应商失败必须由真实返回或有权限的测试端点触发,保存操作路径及恢复凭据;不主动滥用平台制造封禁。无法稳定触发的分支标阻塞,不伪造结果。只读 DB 查询可辅助定位,但不得 SQL UPDATE/INSERT 构造业务成功或强行推进生命周期。

4. 功能覆盖矩阵与执行顺序

122 个独立编号用例,17 个覆盖模块(19 组编号);参数化子项另逐项记录。下表编号用于查找模块,不代表无条件逐项执行;实际按下方依赖顺序执行。破坏性/不可逆项在正常路径留证之后执行。API 补充用例与对应 REAL 结果分开统计。

顺序 / 模块 当前页面、领域入口 用例
1 基础部署与配置 /healthzCompose、Cobra、配置、持久化、日志、静态资源 SYS-01SYS-06
2 登录/导航/公共组件 /#/login/#/、Layout、全部页面共用控件 UI-01UI-07
3 网关与浏览器运行时 /#/gateways GW-01GW-05
4 出口 /#/network-exits/#/network-exits/:id NET-01NET-06
5 账号/环境 /#/accounts/#/accounts/:id/#/browsers/#/browsers/new/#/browsers/:id AC-01AC-07、ENV-01ENV-10
6 gateway 领域能力 /v1/browsers、代际/代理/CDP/抖音受限路由 API 附录 G、GATE-01GATE-06
7 Phase A /#/drafts/:id/#/tasks/#/tasks/:id/#/attempts/:id PH-01PH-10
8 审计 /#/audit、环境动作对/任务/Attempt AUD-01AUD-04
9 采集与 AI 设置 /#/creator/settings SET-01SET-04
10 账号策略 /#/creator/accountsprofile/关系/策略 STR-01STR-07
11 竞品/作品/评论采集 /#/creator/competitorsworks/metrics API,后台调度 COL-01COL-09
12 素材/仿写 竞品页素材区,material API MAT-01MAT-06
13 评论/线索/规则 /#/creator/workbench 三个页签,rule-results API LEAD-01LEAD-07
14 人工写/私信/操作记录 工作台另两个页签,operations/messages API OP-01OP-08
15 真实事件/自动响应 浏览器通知→gateway events→creator events→策略执行 EVT-01EVT-08
16 API 契约补充 无 UI 的导入、详情、显示时间及错误边界 API-01API-06
17 清理与最终核对 账号、策略、平台内容、环境/卷及证据 END-01END-02

依赖执行顺序(从干净环境开始):

  1. 完成 SYS-0103、SYS-06 及 UI 登录/导航,创建 GW-01 网关、NET-01 出口、AC-01 账号与 ENV 创建/启动所需记录;公共组件的有数据/错误状态随对应模块补测。
  2. 取得环境引用后执行 GW-02 的引用冲突分支及其他资源关联检查;删除/停用/令牌失效等分支使用独立资源,或延后至这些资源的所有依赖用例完成。不得提前删掉后续真实测试使用的网关、运行时或出口。
  3. 完成 AC-06 登录检查及非破坏性环境/gateway 检查;创建 Phase A 草稿并完成任务流程;配置采集设置与账号资料/关系。策略可保存,但自动写入保持关闭。
  4. 完成竞品采集,再以真实作品/评论执行素材、规则/线索和人工操作。完成前述数据创建后,才执行 SYS-04 持久化检查:账号、环境、草稿、规则、素材均实际存在;保存各项证据后重启。不能为满足前置而改库造数据。
  5. 人工动作留证后执行 EVT 自动响应,再立即停用策略;审计用例在所需动作/任务记录产生后执行。API-only 导入可在合法账号/来源就绪后独立执行,但修改全局指标设置的 API-02 应在 REAL 指标观察完成后执行并恢复设置。
  6. 完成上述正常路径后执行依赖中断与其他破坏性分支(含 SYS-05、AC-07、NET-06、ENV-09),逐项恢复,再做 END 最终核对及清理。涉及重启/断网的其他用例也遵循“先留证、独立资源或延后、再恢复”。

执行依赖:AC-06 失败会阻塞 COL/EVT 及依赖 logged_in 的 OP 正向流程,但不阻止网关受限读取的独立核验和通用模块。REAL 采集产生 W/K 后再做素材和线索;若用 API 样例数据做界面补充必须标 API,不替代这条依赖。先测试人工动作,再开启自动策略;结束自动测试后立即停用策略。AC-07 撤销、NET-06 停用、ENV-09 故障与 END 清理放在相应数据不再被后续用例需要时执行。

5. 详细用例

下列每例均必须单独填写结果。前置里的其他编号意为其输出已真实取得,不允许只因计划写了该编号就视为满足。参数化子项逐行记录;一项失败即该用例未全部通过。

5.1 基础部署与配置

SYS-01 部署、健康和静态入口 [UI/API]

  • 前置:专用干净主机,2.1 配置齐备;允许后续部署。
  • 操作:
    1. 按部署说明启动 control-plane、native gateway 和前端,并记录进程与 gateway 运行时 digest
    2. GET 控制面和 gateway 的 /healthzGET 带认证的 /api/gateways
    3. 打开 BASE/,再打开实际 JS/CSS 资源;刷新 /#/accounts 及 /#/browsers/new
  • 预期:两个健康接口 204;数据库健康、服务持续运行;API 返回 JSON,页面/资源可加载。healthz 不等于数据库、平台或全部依赖已通过。

SYS-02 控制面配置与命令校验 [API/FAULT]

  • 前置:SYS-01 gateway 运行时配置;采用 F9,禁止改运行配置。
  • 操作:
    1. 分别单项设置 LISTEN_ADDR=:0、LOG_LEVEL=bogus、WEB_DIR仅三个空格、DATABASE_URL=http://example.invalid/db
    2. 分别设置用户名仅三个空格或含冒号、密码不足6字节、主密钥非Base64或解码长度不为32、凭据目录为相对路径、BAILIAN_BASE_URL 含 userinfo
    3. 一次性容器运行 control-plane 的 --help;另传不支持的位置参数
  • 预期:非法输入非零退出、日志清楚指出字段且不泄露值;配置校验先于数据库/凭据/runtime/systemd 副作用。只有当前最小根命令,无编造子命令。help 不启动服务;未支持参数拒绝。Viper可能将空环境变量视为未设置并采用默认值,因此空白字符串校验与“未设置/空变量默认值”另行记录,不能混为必然启动失败。

SYS-03 gateway 配置与依赖错误 [API/FAULT]

  • 前置:SYS-01 gateway 运行时配置;F9 独立命令。
  • 操作:
    1. 单项试 LISTEN_ADDR=:0、GATEWAY_TOKEN=short、BROWSER_STATE_DIR=空、BROWSER_PROFILE_ROOT=非 owner-only 或 browser path 不存在
    2. 恢复有效配置;在专用测试实例令 browser path 指向不存在路径,GET /v1/browsers
    3. 结束一次性实例并回读原服务列表
  • 预期:非法配置明确失败;缺 browser path、Profile 权限或 systemd/Xvfb 条件的真实领域请求报错、不返回假空成功;原环境不受影响。健康接口能返回不证明 runtime 可用。

SYS-04 持久化与重启 [UI/FAULT]

  • 前置:已有账号/资料密码、环境、草稿、规则、素材至少各一条;主密钥备份。
  • 操作:
    1. 记录各 ID、版本、非秘密字段和 Profile 内自建 RUN 书签
    2. 正常重启 control-plane、native gateway,保留 PostgreSQL/凭据/素材/Profile目录
    3. 重新登录并逐页读取;浏览器启动后核对书签;用原真实会话执行一次已授权只读身份检查
  • 预期:记录、版本链及文件不丢;原主密钥可解密既有凭据。启动不得无限复制记录;事件恢复另按 EVT-03。无主密钥不做破坏性换密钥实验。

SYS-05 数据库失联与日志 [UI/FAULT]

  • 前置:没有正在进行的 REAL 写动作;已保存一条规则。
  • 操作:
    1. 用 F5 停 postgres,读取账号并尝试保存一条带 RUN 的规则
    2. 查看页面、响应与 creator-hub 结构化日志
    3. 恢复 postgres,只读查询规则列表判断前次是否入库,再手动决定是否补写
  • 预期:报错可观察,不把失败当空列表或成功;日志含 service/关联上下文但无凭据。未知提交结果先核验,不自动重复建档。

SYS-06 部署模式、关停和资源归属 [API/FAULT]

  • 前置:可切换独立测试时段;本轮资源已登记。
  • 操作:
    1. 正常停止 gateway,记录耗时/退出码/日志并检查无 SIGKILL,随后恢复
    2. 核对只有 host-native gateway 管理 browser/Xvfb unitruntime metadata、owner、node 和 generation 可追踪
    3. 完整部署结束后按 compose.dev.yaml 单独启动依赖与开发进程;打开5100入口并观察 /api 到8082、网关28187映射
  • 预期:正常关停在45秒宽限内完成或明确失败;代理/事件订阅不悬挂。生产8080与开发5100/8082入口均可用,错误网关地址不能假成功;两种模式不共用活动测试实例。

5.2 登录、导航与公共组件

UI-01 登录正常与持久凭据 [UI]

  • 前置:正确测试 Basic 凭据;清除本浏览器 creatorhub.auth,不删除业务数据。
  • 操作:
    1. 打开 /#/login,输入空白用户名/空密码检查禁用与密码遮挡
    2. 输入有效凭据登录,检查 GET /api/gateways 和跳转
    3. 刷新页面;访问 /#/login;再直接访问 /#/accounts/{A}
  • 预期:合法登录进账号列表且可刷新;已有本地凭据不重复显示登录表单。页面不承诺退出按钮或登录后恢复原深链。生产若先出现 HTTP 原生认证框应如实记录。

UI-02 错误凭据、过期和网络失败 [UI/FAULT]

  • 前置:UI-01;可以清除自己的本地键。
  • 操作:
    1. 错误密码提交一次,记录401文案与输入保留
    2. F1 Offline 再提交一次,恢复后再登录
    3. 仅把本地 creatorhub.auth 改为错误测试凭据,访问账号列表触发真实401
  • 预期:错误密码提示不正确;网络失败不等于401;业务401清键并转登录;再次登录回账号列表。不得将“键存在”当凭据已验证。

UI-03 导航、深链与窄屏 [UI]

  • 前置:正常登录,各模块至少有一条记录。
  • 操作:
    1. 逐一打开覆盖矩阵所有 Hash 路由和详情链接,检查当前导航高亮、返回、浏览器前进后退
    2. 桌面从顶部和侧栏各折叠/展开一次;360px宽打开导航,点遮罩与项目关闭
    3. 打开不存在资源ID和未知 hash 路径,记录页面状态
  • 预期:已定义路由可达、核心操作不被遮挡;详情归属高亮。不存在资源不能显示另一条记录;无通配404是边界观察,不编造已有404页面。移动环境卡片缺详情入口单列缺口。

UI-04 下拉、标签与基础表单 [UI]

  • 前置:账号创建及环境创建表单可打开,不提交真实写。
  • 操作:
    1. 下拉用上下/Home/End移动,Enter/空格选择,Escape及点外部关闭
    2. 标签输入带空格和重复项,分别用 Enter、英文逗号、失焦提交;空输入 Backspace 和移除按钮删项
    3. 切换复选框/开关,检查禁用项;尝试只填星号字段但值空白
  • 预期:标签trim去重、不出现空项;下拉选择/焦点反馈明确,禁用项不能提交;星号不代替真实校验,若无效值发出,继续核验后端拒绝,不记前端已阻止。

UI-05 弹窗取消、忙碌和重复点击 [UI/FAULT]

  • 前置:gateway 运行时或账号普通创建弹窗、出口停用确认框;F2。
  • 操作:
    1. 普通创建输入后分别用取消、关闭图标、Escape、遮罩退出再打开
    2. 确认框先取消一次,检查无写请求
    3. 限速后只确认一次并迅速二次点击,尝试关闭;恢复网络读取最终结果
  • 预期:取消不写、重开按页面规则重置;busy按钮不重复写。确认框忙碌不可关闭;普通创建弹窗若仍可Escape/遮罩关闭记录真实行为并核对迟到结果,不能统一宣称所有弹窗锁定。

UI-06 加载、失败、空态与错误恢复 [UI/FAULT]

  • 前置:干净数据时留存各页空态;F1可用。
  • 操作:
    1. 分别阻断 accounts、browsers、gateways、network-exits、creator各列表、drafts、audit、attempt详情 GET
    2. 逐页检查加载结束后错误区、操作禁用及是否显示假空态
    3. 取消阻断,只有存在重试按钮的页面点击重试,其余重新进入页面
  • 预期:失败与空数据可区分,不能隐藏依赖错误;没有重试按钮不写“重试成功”。特别记录账号草稿、环境创建依赖、规则列表异常呈现;不得自动重做先前写请求。

UI-07 长内容、可访问性与复制 [UI]

  • 前置:准备长中文/英文ID、URL、标题及换行文本;仅测试数据。
  • 操作:
    1. 在窄屏和键盘模式遍历页面操作,检查横滚、换行、焦点、标签、role=status/alert
    2. 打开弹窗,Tab/Shift+Tab及关闭检查焦点;核对帮助/错误与输入关联
    3. 复制可显示的CDP和网关token到本地私密临时区,随后撤销剪贴板权限再试
  • 预期:核心内容可读、禁用可辨;复制内容与来源一致但不要求当前不存在的成功提示。焦点圈定/自动聚焦、aria-describedby缺口如实报,不把缺失能力当支持;截图无秘密。

5.3 网关运行时

GW-01 注册、令牌与列表 [UI]

  • 前置:测试 gateway 已运行,知道其真实 token。
  • 操作:
    1. 注册名称G、实际Endpoint、显式token;读取列表并尝试相同名称再次注册
    2. 另建未被环境引用的登记项,token留空,记录自动生成提示、显示/隐藏/复制
    3. 关闭再进页面检查值持久化,不进行未授权健康探测
  • 预期:真实项能用于ENV创建;重复注册冲突;生成token只代表登记成功,未与gateway配置一致不能调通。列表不显示不存在的实时健康状态。

GW-02 编辑、改名和令牌替换 [UI]

  • 前置:G已有一个测试环境,备份原名称/Endpoint/token。
  • 操作:
    1. 编辑时确认token不预填;只改名并保持空token保存
    2. 重读环境与网关,核对引用同步;再改回原名
    3. 将token改为另一个格式合法但不匹配的测试值,显式启动测试环境一次;恢复原token并只读核对
  • 预期:改名关联一致,空token保持旧值;错误token造成可见gateway失败而非成功;恢复不自动重发未知生命周期操作。

GW-03 注册字段与失败保留 [UI/API]

  • 前置:未引用的测试名称。
  • 操作:
    1. 分别输入空白/非法首字/超64名称、非法scheme或含空格Endpoint、短于16或超128token
    2. 通过附录A请求绕过前端提交一项非法值
    3. 用F1阻断保存,请求失败后检查表单内容,恢复后手工保存
  • 预期:前后端按各自校验拒绝非法输入,失败保留内容,不自动新增。格式合法但连接失败与字段非法分开记录。

GW-04 页面删除接线检查 [UI]

  • 前置:新建未引用网关登记项,保存其名字。
  • 操作:
    1. 点击删除先取消,确认列表仍在且无DELETE
    2. 再打开确认删除并确认一次,观察Network、Console与页面
    3. 刷新列表读取实际记录
  • 预期:预期删除应发送领域DELETE并移除记录;gateway 被环境引用时必须拒绝删除。不得使用后端删除成功掩盖UI失败;runtime 回收另用 GW-05。

GW-05 网关删除 API 与引用冲突 [API]

  • 前置:GW-04未引用登记项和被环境引用G;附录A。
  • 操作:
    1. DELETE /api/gateways/{未引用项}GET列表
    2. 重复DELETE原名称,记录不存在结果
    3. DELETE仍被环境引用的G,回读G和环境
  • 预期:未引用项成功删除;不存在返回明确结果、不影响其他项;引用中的网关409拒绝且环境引用不丢。此用例独立于UI删除缺陷。

gateway 使用宿主机已核验的默认浏览器运行时;运行时安装、版本和路径由 gateway 配置与 /v1/info 能力负责,不在 control-plane 建立版本管理用例。

5.4 网络出口

NET-01 创建与认证字段 [UI/API]

  • 前置:四类真实代理端点;认证凭据仅在私密表单输入。
  • 操作:
    1. 逐协议创建出口,填写host/port及已知预期IP/地区,初次读取列表/详情
    2. 带认证端点填用户名密码;核对当前明文展示并遮盖证据
    3. 先不检测,打开环境创建候选
  • 预期:初态unchecked,未检测不能成为健康候选;协议/地址可回读。当前UI/API明文不是遮挡断言,凭据不得进入对外证据。

NET-02 字段与无效出口 [UI/API]

  • 前置:附录B出口样例。
  • 操作:
    1. 依次试空host、非法host、端口0/65536/小数、只有密码无用户名、超长值
    2. 分别经UI和一次API提交越界值
    3. 对不存在ID GET/check/disable
  • 预期:非法输入明确拒绝、不保存半条记录;不存在资源明确失败、不误操作其他出口。

NET-03 真实检测、健康与身份不符 [UI]

  • 前置:真实端点P1;另建预期IP故意不等于实际IP的测试出口。
  • 操作:
    1. 在列表点击P1检测并查看观测IP、检测时间、状态和reason_code
    2. 进入详情回读;再显式检测一次
    3. 检测IP不匹配项及不存在服务的端点
  • 预期:健康以实际观测匹配为准,不以“检测完成”toast为准;不匹配/连接失败为unhealthy并有原因,最近检测更新;无自动列表检测。

NET-04 代理故障与禁止直连回退 [UI/FAULT]

  • 前置:P1绑定运行环境,测试目标可读取实际公网IP;无平台写。
  • 操作:
    1. 浏览器访问批准的IP回显目标并存证
    2. F6停止代理,点击检测并在浏览器重试只读目标
    3. 恢复代理并重新检测,再核对环境、账号和任务状态
  • 预期:失败期间不能从宿主直连出口成功访问;出口不健康和相关阻断可见;恢复健康不自动恢复旧hold任务。

NET-05 绑定关系、详情和请求失败 [UI/FAULT]

  • 前置:P1至少绑定一个账号,另有直连环境。
  • 操作:
    1. 查看列表绑定账号、详情、出口条件审计链接
    2. F1阻断 /api/browsers,重新进入出口页
    3. 解除阻断,点击实际提供的环境重试;进入不存在出口详情
  • 预期:读取失败显示未知而非未绑定;恢复后绑定一致;直连不误关联P1。详情无编辑/删除/重新启用按钮。

NET-06 停用与重复操作 [UI/API]

  • 前置:专用P2绑定账号且有排队Mock任务;不再供后续正常流程。
  • 操作:
    1. 点击停用先取消,再确认,连续点击检查busy
    2. 回读出口、账号、任务、浏览器实例
    3. 附录B重复disable并调用check
  • 预期:停用导致账号暂停/排队任务hold,运行清理结果明确;disabled不能通过check重新健康;UI检测/停用均禁用,服务端重复动作不产生新活动实例或恢复任务。

5.5 社媒账号

AC-01 账号创建、标签和平台范围 [UI/API]

  • 前置:RUN;真实A UID与可选Cookie,另有仅用于建档的公众号/快手测试标识。
  • 操作:
    1. 创建抖音账号名称两端空白、UID、去重TAGS,Cookie留空;读取列表与详情
    2. 再建一条含合法Cookie的测试账号,检查响应与日志不回显Cookie
    3. 分别创建wechat-official、kuaishou建档项,仅核对通用字段,不打开其平台业务
  • 预期:服务端生成ID、authorized/paused、版本1;名称/UIDtrim,标签持久化;空Cookie允许,不证明真实登录。非抖音仅建档范围。

AC-02 账号非法、重复和创建未知 [UI/API/FAULT]

  • 前置:AC-01;附录C。
  • 操作:
    1. 试空白名称/ID、128上限及超长、非法platform、非法Cookie格式
    2. 重复同平台同UID,核对409和输入保留
    3. 在发送合法新建后用F1断开浏览器连接;恢复只读查平台UID是否已创建
  • 预期:非法/重复明确失败;技术ID/授权/状态不由客户端创建字段控制;连接失败保留输入但不得立即盲重发,503 account_creation_result_unknown 时按返回account_id核验。

AC-03 详情与资源就绪 [UI/FAULT]

  • 前置:未绑定账号、E0直连账号、E1代理账号。
  • 操作:
    1. 逐个进入详情核对账号版本、授权、运行状态、环境/出口/绑定版本和原因
    2. F1阻断环境GET,检查状态未知与重试按钮
    3. 恢复读取,分别观察未绑定、cleanup_pendingENV-09生成)、出口不健康(NET-04)时恢复/草稿禁用
  • 预期:依赖读取失败不当ready;直连允许无出口;调度原因与后端一致。没有活动实例不等于账号已恢复,后续显式恢复/启动分开。

AC-04 暂停、恢复与版本关联 [UI]

  • 前置:账号已有运行环境与queued Mock任务。
  • 操作:
    1. 暂停先取消确认,再确认;查看版本、实例及任务
    2. 资源就绪且无活动实例后点击恢复账号
    3. 回读账号和旧任务,再到环境页显式启动
  • 预期:暂停递增版本并hold相关任务、停止结果可追踪;恢复无第二确认框,只恢复账号,不自动恢复旧hold或平台发送;资源不满足时拒绝。

AC-05 文本草稿创建及失败保留 [UI/MOCK]

  • 前置:账号资源ready;草稿只测Phase A。
  • 操作:
    1. 输入空白检查禁用;输入含首尾空格/换行的RUN文本创建
    2. 核对草稿版本和原文本,创建第二版
    3. F1阻断创建再提交一次,检查输入保留;单独阻断草稿GET并查看错误呈现
  • 预期:创建成功刷新并清输入,保存原文本;新版本可追踪。草稿列表失败不得默认为无草稿;若界面隐藏错误记失败。绝不当真实发布。

AC-06 真实登录身份与首次可达性 [REAL/API]

  • 前置:新建抖音A、实际UID;已启动专用浏览器,所有者可人工登录。
  • 操作:
    1. 在真实浏览器手工登录A,使用附录G identity(expected_account_key)核对UID,保存脱敏响应
    2. 回读 /api/creator/accounts/{A}/profile,观察控制面是否出现logged_in及时间
    3. 调用login-result提交logged_in确认不能人工冒充;若仍unknown,检查当前公开操作是否存在可达真实核验入口,不改库;同时用已真实验证的既有账号作对照
  • 预期:gateway能核实真实UID;公开写logged_in返回409。若真实登录无法反映到控制面,首次登录E2E记阻塞/缺陷并阻断依赖用例;不能用内部方法/伪造数据强行通过。密码配置不自动登录。

AC-07 撤销授权 API [API]

  • 前置:一次性账号已绑定环境、有queued任务;本轮不再使用,附录C。
  • 操作:
    1. POST /api/phase-a/accounts/{A}/revoke,无body
    2. 读取账号、环境、任务与审计;尝试resume、创建草稿、确认入队
    3. 重复revoke,记录版本和事件变化
  • 预期:撤销不再允许调度,queued转hold,运行清理结果明确;不存在重新授权页面/接口不能假设可恢复。重复动作不产生平台写或恢复授权,具体版本变化留证。

5.6 运行环境

ENV-01 最小直连环境与显式启动 [UI]

  • 前置:已授权暂停账号、G、启用V1。
  • 操作:
    1. 打开创建环境填写名称、alias、seed1000、账号/G/V1,出口选直连,提交
    2. 读取列表/详情及gateway runtime状态
    3. 去账号详情恢复账号,回环境列表显式启动,复制CDP并按已批准连接方式打开浏览器
  • 预期:创建先停止态,固定绑定正确;恢复账号和启动分离;运行有实际 browser/Xvfb unit 与 lease,直连无出口也可用。CDP展示/复制不代表公网端口已发布。

ENV-02 代理环境和高级指纹 [UI/REAL]

  • 前置:另一暂停账号、healthy P1、G/V1。
  • 操作:
    1. 创建E1选择P1;高级字段依次填windows/linux/macos中的一个、Chrome/Edge/Opera/Vivaldi中的一个、版本、CPU、语言、时区与伪装禁用项
    2. 恢复账号并启动,Docker inspect核对argv、Profile目录和无凭据代理地址
    3. 浏览器查看navigator语言/CPU等及真实公网IP;停启后重新核对
  • 预期:选择参数保留且argv独立传递;实际IP匹配P1,凭据不出现在命令/标签。OS/brand其余合法选项分轮独立记录,不要求同一环境改指纹入口。

ENV-03 创建边界、默认项与依赖错误 [UI/API]

  • 前置:空依赖与齐备依赖分时段;附录D。
  • 操作:
    1. 缺网关/gateway 运行时/可绑账号/健康出口时打开表单查看准备提示;F1阻断依赖GET后再开
    2. 分别试alias非法/超32、seed0/2147483648/小数、CPU负数/129、非法语言/时区、指纹内proxy_server
    3. 修正后创建;并用API重复同alias不同账号或已绑定账号的新alias
  • 预期:默认只选合法依赖;错误读取不伪装业务缺项;字段越界后端拒绝。相同资源配置重复按幂等核验,冲突配置409;一账号不出现两个活动绑定。

ENV-04 列表详情与不主动探测 [UI/API]

  • 前置:E0/E1存在;能读取gateway日志。
  • 操作:
    1. 刷新列表及详情多次,观察浏览器Network和gateway请求时间
    2. 从桌面环境名进详情、跳账号/出口并返回;360px宽重复观察
    3. 读取长alias、已停止环境、不存在alias详情
  • 预期:列表/详情只取持久状态,不因刷新触发显式检测或生命周期;独立20秒后台调和日志不得误判为页面轮询。详情无生命周期按钮,移动详情入口缺失按实际记录。

ENV-05 启停、重复和取消回收 [UI/API]

  • 前置:运行E1Profile建RUN书签。
  • 操作:
    1. 停止一次并核对容器/列表,再用API重复stop;启动一次后用API重复start
    2. 点击回收取消,确认容器仍在;再确认回收
    3. 只读核对容器消失、环境/binding/Profile仍在;从控制面启动重建
  • 预期:running时UI启动禁用、停止只对running开放;重复动作不多建runtime;回收不是永久删除,书签/seed保持。真实结果不明先查实物,不自动重发。

ENV-06 升级、版本与Profile [UI]

  • 前置:E1使用P1且V2启用,已保存书签。
  • 操作:
    1. 打开升级不选目标及选当前版本检查禁用
    2. 选择V2确认,忙碌时尝试关闭
    3. 完成后核对旧容器消失、新digest、指纹/书签/绑定版本;再选择不可用目标验证错误
  • 预期:升级重建容器但保留Profile/指纹;错误可见且不声称自动回滚。当前失败可能关闭弹窗,应在列表仍可见错误与实际版本。

ENV-07 直连升级与出口重绑边界 [API/UI]

  • 前置:E0直连、E1已暂停并无活动runtime、healthy P2;附录D。
  • 操作:
    1. 对E0在UI尝试升级一次,记录真实返回和残留,不据直连create推断升级支持
    2. POST E1/rebind {network_exit_id:P2},读取新绑定版本/旧任务快照
    3. 分别试运行中rebind、unhealthy出口、空字符串切回直连
  • 预期:合法重绑只在暂停无执行/活动runtime条件满足后成功,旧快照不得沿用;空出口重绑当前400拒绝。直连升级若因出口校验失败记当前限制,不假称支持。

ENV-08 并发互斥和失败后的恢复 [API/FAULT]

  • 前置:仅E1测试账号;两个API客户端,不发平台业务动作。
  • 操作:
    1. 两端同时POST start,保存每个响应与operation_id
    2. 在一次启动进行时另端 pause 账号或修改 gateway 运行时配置
    3. 读取账号、environment及runtime/systemd 实物,按最终有效配置恢复
  • 预期:不会双 runtime 或使用已失效配置绕过锁;完成审计与实际generation匹配;冲突/失败明确,未批准状态不能偷偷启动。恢复 gateway 运行时或账号只在核验后显式执行。

ENV-09 gateway失联、清理待定与租约 [UI/FAULT]

  • 前置:E1有runtime/queued任务;F3/F7可用。
  • 操作:
    1. F3停gateway后停止或回收环境一次,记录cleanup_pending/unknown/错误
    2. 恢复gateway,只读观察至少两个20秒调和周期及审计
    3. 另轮 F7 停止/强杀 browser unit,不删除 Profile,观察missing/runtime释放,再显式启动
  • 预期:失败不能假已停止/无绑定;后台恢复有requested/finished证据,租约不长期显示可调度假running;新旧generation不混用,Profile不丢。

ENV-10 非法动作与资源失效 [API]

  • 前置:附录D;测试alias及不存在alias。
  • 操作:
    1. POST现有alias/unknown-action;给upgrade增加未知字段或非法version
    2. 给create未知字段、gateway 运行时不可用或未授权账号;GET不存在alias
    3. 回读原环境和动作审计
  • 预期:非法操作400/冲突404等明确,不修改旧环境;重绑拒绝输入的审计不泄露输入秘密;没有通用 PUT 更新或任意 browser/CDP 操作入口。

5.7 gateway 领域 API

GATE-01 路由、认证与请求格式 [API]

  • 前置:附录G;测试gateway可达。
  • 操作:
    1. 分别无token/错误token GET /v1/browsers,再用正确Bearer读取
    2. POST create提交未知字段、非对象JSON、缺body及超过1MiB body
    3. 访问非领域路径与不存在alias,最后回读正常列表
  • 预期:除healthz外领域请求校验token;非法body400,未知路径404,不提供通用 CDP 代理;列表未夹带其他非本 gateway runtime。

GATE-02 创建/启停/删除与代际 [API]

  • 前置:单独的gateway实验alias,不对应活动控制面环境;附录G创建样例及gateway 已配置的运行时。
  • 操作:
    1. POST /v1/browsers 创建停止态实验 runtimeGET列表提取实际runtime/network/binding
    2. 按附录G正确generation进行stop/remove;重复remove核对幂等或明确冲突
    3. 另轮G-create改stopped=false创建运行态实验 runtimeGET取得真实network与runtime后用正确generation依次stop/start,核对实际状态;再用旧runtime_id或错误binding执行start/stop/remove并读取runtime/systemd 实物
  • 预期:合法操作可观察,创建返回201;过期代际409且不操作新 runtime;不匹配 owner/node/generation 的对象不可删除。实验资源按END单独回收,不交给控制面冒充业务环境。

GATE-03 代理恢复与隧道生命周期 [API/REAL/FAULT]

  • 前置:代理E1;附录G proxy payload必须从本轮真实generation组成;只读测试目标。
  • 操作:
    1. 打开经代理的HTTP请求与HTTPS CONNECT长连接并记录实际出口
    2. F3重启gateway,通过正常租约恢复或独立实验alias的POST proxy恢复;观察恢复前后连接
    3. 替换代际/回收实验alias,验证旧连接关闭;错误network_id恢复再观察新旧连接
  • 预期:恢复只允许当前generation;旧隧道关闭不继续借用已失效代理;不从代理失败回退直连;错误代际拒绝且不损害新runtime。

GATE-04 Cookie注入、身份与受限读取 [API/REAL]

  • 前置:测试账号所有者提供有效Cookie或已手动登录;附录G。
  • 操作:
    1. POST cookies仅注入允许域的测试Cookie,不保存原值证据;POST identity使用真实expected_account_key
    2. POST get读取self、作品分页、一级评论分页;与平台页面对照
    3. 分别改为非法域Cookie、错误身份、非抖音URL、额外query或非法cursor
  • 预期:合法身份和读取可核验;错误目标/不允许的URL拒绝,不执行任意JS/CDP;Cookie不回显。验证码/设备挑战保留为真实失败,人工处理后重新只读核对。

GATE-05 六类动作预览与拒绝边界 [API/REAL]

  • 前置:已登录测试环境,只有预览授权;附录G action;不提交confirm=true。
  • 操作:
    1. 逐个action填批准目标,confirm=false请求预览;关注预览只读检查关注状态
    2. 分别填错误expected_uid、自己为目标、缺comment/work/UID、文本空或超1000
    3. 查看平台目标确认没有发生新评论/私信/点赞/关注
  • 预期:预览无写,身份核对失败不发送;目标字段和文本校验可见。对仅confirm阶段才校验的目标保留区分,不能以preview响应证明实际发送成功。

GATE-06 订阅/取件/确认与停止 API [API/REAL]

  • 前置:单独事件实验alias已真实登录;暂不由控制面监听同alias;附录G events。
  • 操作:
    1. POST启动订阅;GET带generation body及limit=100&wait=25等待真实基线/通知
    2. 保存delivery_id,未ack再GET检查重投;GET带ack确认后再次读取
    3. 分别GET limit=0、limit=101、wait=-1、wait=31核验非法参数400;再用合法参数读取确认订阅未被破坏
    4. DELETE停止,再重复停止;用旧generation请求不得影响新订阅
  • 预期:真实通知字段/边界可观察;确认后不重复交付已确认项,断连有状态而不是假连续;GET队列不是轮询平台源,端到端处理仍由EVT验证。

5.8 Phase A 草稿、确认、任务与 Attempt

PH-01 草稿版本与确认 [UI/MOCK]

  • 前置:AC-05有两版草稿,资源ready。
  • 操作:
    1. 打开第一版草稿核对“非最新”及最新版本链接
    2. 到最新版本,不勾已核对检查确认禁用;勾选后打开确认框,取消一次
    3. 再次核对账号/草稿版本与环境/出口并保存,GET确认列表/详情
  • 预期:旧版本不能当最新确认;快照包含正确关联,确认请求busy防重复;成功显示确认记录,取消无写。

PH-02 入队、幂等与直连 [UI/API/MOCK]

  • 前置:PH-01确认Q;分别代理与直连各一条。
  • 操作:
    1. 点击加入队列,记录T及状态
    2. 用同Q再次入队,包括API重复POST /api/phase-a/tasks
    3. 查看关联任务、任务列表与确认详情
  • 预期:首次201/后续复用同任务,不多创建T;直连可入队;已有有效确认时入队不额外要求重新勾已核对。关联任务ID无UI链接时经任务列表/API进入。

PH-03 版本失效与重新确认 [UI/API/MOCK]

  • 前置:已确认未执行的Q/T。
  • 操作:
    1. 新建更新草稿或暂停再恢复账号使版本变化
    2. 旧页面继续确认/入队并读取409/任务readiness_reason
    3. 从最新草稿重新核对确认、重新入队
  • 预期:旧版本拒绝且不会执行旧内容;前端刷新快照;只通过新确认推进,不通过resume绕过版本变化。

PH-04 四类 Mock 结果 [API/UI/MOCK]

  • 前置:仅本轮测试队列,按子项各建一个独立Q/T;附录C mock。
  • 操作:
    1. 逐项POST mock/executeoutcome分别为succeeded、failed、uncertain、policy_hold,每次记录返回task_id/attempt_id
    2. 打开对应任务和Attempt详情,检查原确认/账号/环境关联
    3. 重复读取各状态;空队列再execute一次,另发非法outcome
  • 预期:四项分别为succeeded、failed、needs_confirmation、policy_holdAttempt evidence明确mock_outcome,不声称真实发送。无任务不假领任务;非法outcome400。该接口不接收指定task_id,必须先核对隔离队列。

PH-05 任务筛选、空态与详情链接 [UI]

  • 前置:PH-04产生多状态任务。
  • 操作:
    1. 在任务页按账号和各状态筛选、再清空,记录每次请求
    2. 分别进入详情访问账号/草稿/环境/出口/审计链接
    3. GET不存在T/AT,并在UI进入对应深链
  • 预期:筛选立即生效,清空恢复列表,无匹配与无任务区分;链接身份一致,不存在记录不能显示上一次详情。

PH-06 不确定结果人工核验与恢复 [UI/API/MOCK]

  • 前置:PH-04 uncertain任务,原绑定/版本仍有效;仅Mock。
  • 操作:
    1. 在详情选择not_executed记录核验,确认仍未排队
    2. 若allowed_action=resume且ready,单独点击恢复;再调用Mock执行
    3. 同一动作busy时重复点击,并在终态试API resume
  • 预期:核验与恢复分离;恢复前校验原资源/版本;无额外不明尝试,终态拒绝不安全恢复。

PH-07 核验成功/失败并结束 [UI/API/MOCK]

  • 前置:两条新的uncertain Mock任务,分别作succeeded/failed核验。
  • 操作:
    1. 在任务详情记录核验succeeded或failed,不点击恢复
    2. 单独点击结束,再读详情/审计
    3. 结束后重复finish,或以非法result调用verify
  • 预期:结论与任务终态对应;核验本身不直接结束、不自动重发;非法/不允许状态明确拒绝。核验仅Mock证据,不能给真实操作编造结论。

PH-08 资源hold和未知原因 [UI/API/FAULT/MOCK]

  • 前置:queued任务;NET-04或AC-04可造成资源hold。
  • 操作:
    1. 暂停账号或使代理不健康,读任务hold/readiness/allowed_action
    2. 在未恢复资源时API resume检查409/503及reason_code,再按流程恢复原资源
    3. F10仅替换任务GET为未知hold+allowed_action=resume,观察按钮与警告,勿点击写;关闭替换
  • 预期:旧hold不自动解除;已知原因给安全动作;未知原因不应露出可误用恢复入口,当前矛盾返回的UI缺口记失败。响应替换仅UI覆盖,不证明后端能产生该状态。

PH-09 取消 API [API/MOCK]

  • 前置:一条queued及一条policy_hold任务;附录C。
  • 操作:
    1. POST T/cancel并回读,重复cancel
    2. 对已succeeded任务调用cancel观察拒绝
    3. 如能在真实在途Mock请求中捕捉executing则取消并核验needs_confirmation,否则执行中子项阻塞
  • 预期:未执行任务取消后不被Mock领取;执行中不能假称未执行,需核验;无页面取消按钮。为造executing不得改数据库,竞态未命中如实记录。

PH-10 领取并发、崩溃及租约 [API/FAULT/MOCK]

  • 前置:只有一条本轮queued任务;两个Mock客户端。
  • 操作:
    1. 同时调用两个worker_id的mock/execute,记录was_claimed/attempt_id
    2. 新建任务再次执行,能捕捉executing时用F4强杀;恢复后等待超过1分钟再触发一次Mock领取
    3. 查询旧任务/Attempt/审计,记录是否进入需要核验而非重复执行
  • 预期:同任务至多一个领取;过期执行租约隔离为needs_confirmation,不自动当未执行重试。Mock处理很快,若无法命中执行窗口则该子项阻塞,不能SQL塞租约通过。

5.9 审计

AUD-01 动作链和安全证据 [UI/API]

  • 前置:ENV生命周期及PH流程已有成功/失败/unknown记录。
  • 操作:
    1. 按环境或任务进入审计,逐条对照requested/finished的同operation_id
    2. 访问账号/任务/Attempt/环境/出口链接,核对版本及实例
    3. 检查公开details、Attempt evidence及结构化提醒日志
  • 预期:每次领域动作结果可追踪,关联实际runtime;失败/不明不混成功;公开证据不含Cookie/代理密码/token。仅task需关注状态应有结构化提醒,不编造短信/邮件通知。

AUD-02 过滤、深链与日期 [UI/API]

  • 前置:已知两个账号/任务及跨日期事件。
  • 操作:
    1. 逐个输入账号、任务、Attempt、alias、出口、事件类型和起止日期,记录API query及结果
    2. 用hash内前五个条件深链打开;更改过滤后确认页码回1
    3. 清除过滤;提交反向日期和API非法RFC3339
  • 预期:命中集合和时区转换正确,反向/非法时间不能悄悄返回无关记录;深链事件/日期不初始化是当前边界,不误写已支持。

AUD-03 分页和当前页CSV [UI]

  • 前置:通过实际生命周期/Mock动作产生超过25条审计,不改库。
  • 操作:
    1. 逐页前进后退,检查total、每页25与首尾禁用
    2. 按条件过滤并导出当前页CSV,用文本编辑器查看行数/引号/11列
    3. 换到另一页再导出;空集合检查导出禁用
  • 预期:CSV仅当前页,文件名creatorhub-audit.csv11个白名单列与当前页一致,双引号转义,无details或凭据;不宣称全量导出。

AUD-04 只读、异常和恢复 [UI/API/FAULT]

  • 前置:已留存审计证据。
  • 操作:
    1. 确认页面无编辑删除按钮;F1阻断audit GET再进入
    2. 取消阻断重新进入,确认先前审计仍在
    3. API请求page=0、page_size非法值及不存在关联过滤
  • 预期:请求失败区别于空记录,已有记录不丢;非法分页明确拒绝或按已记录契约规范化,不返回误导页码;不写不存在的重试按钮。

5.10 采集与 AI 设置

SET-01 读取、修改与默认值 [UI/API]

  • 前置:保存原settings白名单快照;附录E。
  • 操作:
    1. 打开采集设置核对30/1800/3600/2/86400/2592000默认值(新库)
    2. 修改回溯、作品/一级评论间隔及指标初始/倍数/上限/最长时长,保存再刷新
    3. 检查PUT仅12白名单字段,响应updated_at不回写
  • 预期:设置持久化,成功回显;作品和一级评论共用当前新作品间隔,没有独立评论秒数字段;不编造密钥或连接测试控件。

SET-02 数值、审批与未知字段 [UI/API]

  • 前置:原配置快照;无自动写运行。
  • 操作:
    1. 依次试0/负数/小数秒、倍数1、最大间隔小于初始,查看前端及API结果
    2. 勾AI或转写已审批但provider/model空保存
    3. 在附录E payload加unknown字段及重复JSON对象提交
  • 预期:非法值400且原设置不变;审批不完整拒绝;严格JSON不接受未知字段/尾随对象,失败保留输入。

SET-03 AI真实接入与不可用 [UI/REAL/FAULT]

  • 前置:批准的Bailian与样本评论;LEAD规则已准备,自动写关闭。
  • 操作:
    1. 填bailian/model/审批后执行一次真实评论主题与线索判断,记录模型、响应和业务结果
    2. 取消AI审批后对另一评论分析;再改provider为不支持值并分析
    3. 恢复原批准配置,重新人工发起只读AI分析
  • 预期:真实供应商成功才判可用;禁用/不支持/无密钥明确失败且无假线索;保存设置成功不等于供应商成功,不用Mock AI替代。

SET-04 保存异常与指标重排 [UI/FAULT]

  • 前置:COL中已有新作品和超龄作品;原配置可恢复。
  • 操作:
    1. F1阻断settings PUT保存,查看busy/错误和输入保留,解除后只读校对是否生效
    2. 显式修改指标计划参数,GET作品列表和metrics比较next_metric_at/stop_reason
    3. 恢复原12字段设置,再读取作品计划
  • 预期:失败不误报;更新按新参数重新计算未来计划,超龄/发布时间未知不伪造未来采集;恢复可核验,无页面附加字段污染请求。

5.11 账号资料、关系与策略

STR-01 资料保存与敏感字段 [UI/API]

  • 前置:A/S1账号;附录E profile。
  • 操作:
    1. 切换A,填写登录名、更新密码、实名状态/测试姓名/虚构证件号、业务状态、备注、冷却、统一AI要求并保存
    2. 刷新资料,检查密码输入清空、仅password_configured;空密码再保存
    3. 更新另一个测试密码,检查返回/日志/数据库公开读取均无明文
  • 预期:资料正确持久化;空密码保持原凭据,密码变更不自动登录。人工实名/业务状态不代表平台验证或登录结论。

STR-02 切换账号与保存竞争 [UI/FAULT]

  • 前置:A/B资料不同;F2。
  • 操作:
    1. 编辑A未保存切B,取消确认保留A;再次切换确认丢弃
    2. 限速时加载A后快速切B,再在A保存发出后切B
    3. 恢复网络并回读A/B,比较选中账号、表单、密码标志和实际持久字段
  • 预期:迟到A响应不得覆盖B;保存归属准确,不丢未授权丢弃的编辑;失败保留本账号输入。

STR-03 大号开关与单归属关系 [UI/API]

  • 前置:A/B同平台,S1/S2;另用已建档kuaishou测试跨平台拒绝。
  • 操作:
    1. 开启A大号,附录E POST relation将S1绑定A,再重复同请求
    2. 尝试S1同时绑定B、自己绑定自己、跨平台绑定
    3. 关闭A大号,回读关系/策略,再恢复大号
  • 预期:合法关系唯一且可回读;冲突不悄悄转移小号;关闭大号/关系影响策略与执行前置,重新开启不自动恢复已禁用策略。

STR-04 六动作策略创建与候选 [UI/API]

  • 前置:A大号、S1关系;含文本动作有批准候选。
  • 操作:
    1. 分别为reply_comment/dm/like_comment/like_work/follow/repost填顺序、目标小号、触发事件并创建后停用,逐项保存响应
    2. 测试未选小号、零触发事件、position0、空候选且无AI要求
    3. 输入英文逗号候选并回读规范化target_type/候选列表
  • 预期:策略可创建/读取且按顺序显示;非法配置明确失败;无候选文本时必须具备统一AI要求和配置,不把创建策略当动作执行成功。repost实际写边界见OP-07。

STR-05 编辑排序、启停、删除、解除 [UI/API]

  • 前置:至少两条停用策略,S1与S2可用;无事件自动写授权则保持停用。
  • 操作:
    1. 编辑顺序/执行账号/动作,保存检查排序;取消编辑观察回填保留
    2. 启用再停用、删除一条,反复GET验证;删除不存在ID
    3. 解除S1关系,读策略状态;重建关系后确认不会自动恢复旧策略
  • 预期:显式动作直接生效无虚构确认框;解除关系使相关策略不可继续执行;启停/删除busy防重复,失败不误删行。

STR-06 两段保存失败与切换竞争 [UI/FAULT]

  • 前置:A/B及未绑定S2F1/F2。
  • 操作:
    1. 仅阻断 /api/creator/accounts/{A}/strategies 的POSTUI保存先绑定关系再建策略
    2. 解除阻断,GET relations及strategies核对部分成功,不马上重建
    3. 限速再次编辑策略并切换B,回读两账号关系列表和策略
  • 预期:关系成功/策略失败不报全部成功;页面最终与后端一致,迟到响应不串号。关系不自动刷新或切换竞争缺口证实则记失败。

STR-07 资料枚举、业务限制及登录结果 API [API/UI]

  • 前置:一次性S2;附录E;实际原资料已保存。
  • 操作:
    1. PUT profile试非法实名/业务枚举、cooldown0及超边界,回读原值
    2. POST login-result分别needs_login/failed/manual_required并填写测试原因;再次试logged_in
    3. 在各登录/业务状态尝试创建manual operation(不execute),恢复原人工业务状态;登录依真实核验恢复
  • 预期:非法字段拒绝;人工登录结果不伪造成功;正常/禁言/封禁/注销的动作限制按当前CanWrite执行,禁言文本写阻止,封禁/注销全阻止;不可通过错误登录推断封禁。

5.12 竞品、作品、评论与指标采集

COL-01 分享链接入队与竞品作者登记 [UI/API]

  • 前置:获准作品分享链接;附录F。
  • 操作:
    1. 粘贴抖音或小红书分享内容,确认只创建分享链接解析任务,不同步等待作者信息
    2. 查询任务列表,确认状态从待解析/解析中变化;后台成功后竞品作者才出现在竞品列表并开始监控
    3. 构造无效链接或网关不可用场景,确认自动最多尝试3次,失败原因可查询,并可点击“重新入队”
  • 预期:分享链接任务与竞品作者列表分离;失败不创建半成品作者,不隐藏真实原因;重复成功解析通过平台账号标识幂等更新。

COL-02 暂停恢复与同步前置 [UI/API]

  • 前置:C已登记;分别准备无合格账号和有真实已验证采集账号。
  • 操作:
    1. 无合格账号时点击同步,观察提示和无请求
    2. 暂停C并尝试API sync;恢复后选定可用账号发一次sync
    3. 记录202响应、报告和最终sync_status/last_sync_at/next_sync_at
  • 预期:无权限/未登录/无运行环境不可采;暂停不继续调度;202仅接收结果,必须核对实际采集记录,不直接判完成。

COL-03 真实竞品目标与分页 [REAL]

  • 前置:AC-06真实已验证执行账号与C不同;C有超过20作品/评论且在回溯窗内。
  • 操作:
    1. 先从平台人工记录C的作者UID、若干第一页/第二页作品key;同时记录执行账号不同的作品key
    2. 点击同步并保存gateway受限读取目标、cursor与控制面报告
    3. GET source_type=competitor&source_id=C的作品和每作品评论,对照平台作者/发布时间/页数
  • 预期:必须采到C而非执行账号作品,正确分页无漏重;只采一级评论并保留真实来源。目标canonical转换疑点只是待验证风险,观察到错误归属才记缺陷,不能接受错作品为成功。

COL-04 自有账号后台采集 [REAL]

  • 前置:A真实已验证、有已授权近期作品;记录settings间隔。
  • 操作:
    1. 不点竞品同步,等待后台到期调度一个完整窗口加30秒
    2. GET works?source_type=owned&source_id=A与comments,对照A真实平台内容
    3. 下一个窗口后重复查询,同一作品若也关联竞品来源检查sources
  • 预期:自有采集无需虚构UI按钮;按当前调度实际产生作品/一级评论;同一平台作品不重复建实体,多来源保留,不互相覆盖。

COL-05 回溯、固定周期与断点恢复 [REAL/FAULT]

  • 前置:C具有回溯窗边界内外历史作品;采集量足以分页,F3可用。
  • 操作:
    1. 保存原settings,在UI设置获批较短间隔/回溯窗;记录首轮开始时间
    2. 采集正在分页时F3停gateway,留存成功页/失败cursor与状态;恢复后按调度或显式sync一次
    3. 核对续采、去重、窗口边界,延迟跨过一周期后检查下次时间,再恢复settings
  • 预期:失败不会清掉已采作品或错认全量完成;按真实断点恢复,无并发双claim;迟到跳过过期计划点而非补发一串平台请求。未命中分页中断要记未触发。

COL-06 身份失败、挑战与被阻止 [REAL/FAULT]

  • 前置:独立采集账号可由所有者登出;没有平台写在途。
  • 操作:
    1. 登出平台或换成不同测试UID,点击sync一次
    2. 若自然出现验证码/设备验证/限流,记录原响应分类,不绕过
    3. 所有者恢复正确登录,通过真实身份核对再显式sync,观察blocked/failed及恢复
  • 预期:错身份不采集冒名数据;挑战/认证与普通网络失败分开可追踪;同步前置失败也留下blocked原因,不永久卡syncing。

COL-07 作品过滤、详情和缺字段 [UI/API]

  • 前置:真实采集有不同计数的作品;缺字段样本来自真实响应或另标API补充。
  • 操作:
    1. UI修改最低点赞/评论/转发立即筛选,分别试0、正数、非法负数
    2. 附录F按source、发布时间上下界组合GET,并逐条GET作品详情/metrics
    3. 核对未知发布时间、null指标、真实0、无下次采集原因;F2快速改变筛选
  • 预期:满足全部条件才列出,null不是0,待核验不编造发布时间;迟到请求不能覆盖当前筛选。页面没有作品详情/快照曲线按钮,详情用API。

COL-08 真实指标更新和停止条件 [REAL]

  • 前置:C与A各一条可监测作品,已记录初始metrics;获批低频计划。
  • 操作:
    1. 等待next_metric_at后一个调度周期,读取metrics及作品最新指标
    2. 与平台同时间人工读数对照;记录下一间隔递增、最大间隔封顶
    3. 用settings缩短最长时长使已存在测试旧作品自然超龄,回读停止原因,再恢复原设置
  • 预期:快照时间递增且真实计数一致,计划严格在未来;超龄/未知发布时间停止有原因。竞品指标必须更新目标作品,不因只查执行账号作品而漏采;不足等待时间标阻塞。

COL-09 并发同步、重复来源与读取失败 [UI/API/FAULT]

  • 前置:有真实采集C,两个API客户端。
  • 操作:
    1. 同时POST同C/sync相同account_id,读取响应与sync_status
    2. 完成后再次sync并对比work_key/comment_key数量与sources
    3. F1分别阻断competitors、works和账号依赖GET,观察错误/空态再解除
  • 预期:同C同期只一个有效同步,重复不造重复实体;失败不丢来源关系或隐藏为无作品;lease过期/重启后恢复不得由旧请求覆盖新结果,若无法形成迟到竞争则子项阻塞。

5.13 素材处理与仿写

MAT-01 选择素材与未保存切换 [UI/API]

  • 前置:COL-03真实取得两条作品;附录F。
  • 操作:
    1. 点选择素材,GET material记录selected及各step;重复选择同作品
    2. 修改未保存文稿/要求后点另一素材,先取消再确认丢弃
    3. F2限速快速选择两作品后回读当前素材
  • 预期:同作品选择复用任务,不自动开始处理;取消保留编辑;迟到响应不得把另一作品结果放当前区。没有真实采集时只能标API界面补充。

MAT-02 真实下载、提音轨、转写 [REAL]

  • 前置:选中真实带语音视频M1;媒体授权、磁盘及真实转写程序齐全。
  • 操作:
    1. 点开始处理,观察download/audio/transcription各状态及按钮busy
    2. GET material,对video_reference/audio_reference定位本轮文件;执行只读ffprobe查看格式/时长/采样率/声道,人工播放核对
    3. 打开真实transcript文件与参考文稿核对,检查API及页面是否正确呈现正文
  • 预期:必须获得有效媒体而非HTML;音轨为有效单声道16kHz音频且可解码;转写正文与内容一致且能被用户读到。OriginalURL、.tmp输出格式、transcript字段可能仅路径/未展示均为源码待验证风险,未运行不定性;不能把succeeded字符串作为通过证据。

MAT-03 无音轨、无语音与重复处理 [REAL]

  • 前置:独立M2无音轨/M3有音轨无语音;已选中。
  • 操作:
    1. 分别开始处理并GET状态、实际文件,人工核对媒体确实无音轨或无语音
    2. 完成后再次显式process,比较引用/文件时间/状态
    3. 检查无音轨/无语音情况下确认要求是否可用
  • 预期:无音轨为no_audio并no_speech;空转写为no_speech,不伪造文稿;已完成步骤可复用,不重复下载/转写成功步骤;不把正常无音轨等同失败。

MAT-04 失败步骤、磁盘/供应商及恢复 [REAL/FAULT]

  • 前置:全新已选素材;F8及真实失效媒体链接样本,配置已备份。
  • 操作:
    1. 使用真实失效下载样本,或F8撤转写程序后处理新素材;另轮对本轮已下载source重命名后process
    2. 记录HTTP与job.failed_step/failure_reason、残留.tmp以及文件内容
    3. 恢复原程序/文件/权限,仅对明确失败的素材显式process一次,核对已完成步骤复用
  • 预期:下载/提音轨/转写错误定位到实际步骤,不用“供应商未配置”掩盖所有原因;失败不生成假成功或残缺成品。恢复只处理明确失败、非平台写操作,临时文件清理可验证。

MAT-05 仿写要求确认与保存 [UI/API]

  • 前置:MAT-02或MAT-03真实完成处理;附录F。
  • 操作:
    1. 未确认前试API保存,检查冲突;在UI输入要求并确认
    2. 确认后观察要求锁定,人工填写标题/口播保存,刷新或切回核对
    3. 检查实际PUT body及响应;重复保存相同内容并回读
  • 预期:确认只记录要求/时间,不期待自动生成文稿;未确认保存409;人工文稿正确持久化且归属当前作品。缺Content-Type只观察,按真实结果判定;不得新增或声称存在AI生成按钮。

MAT-06 处理/仿写边界与失败保留 [UI/API/FAULT]

  • 前置:未选作品及已选未处理作品各一条;已确认素材一条。
  • 操作:
    1. 未选时API process、未处理时confirm,试要求超4000字符
    2. 已确认素材保存空标题/口播、标题超1000或口播超100000;F1阻断保存一次
    3. 解除阻断回读,检查旧稿和当前编辑不被丢弃/串作品
  • 预期:未满足前置冲突、超长/空稿400;星号不能代替后端校验。失败保留输入且不覆盖已存稿;未授权并发process不宣称队列化,若双请求可触发要记录真实结果。

5.14 规则、评论分析与线索

LEAD-01 规则创建与关键词 [UI/API]

  • 前置:有真实自有/竞品评论;附录F。
  • 操作:
    1. 规则页填名称、来源all、主题、包含/排除关键词、AI要求创建
    2. 输入带内部空格/大小写关键词,查看英文逗号trim结果
    3. 试连续逗号/结尾逗号/纯空白、必填空值及未知source_type
  • 预期:有效规则持久化,关键词不随意改内部内容;空项/非法值拒绝,失败保留表单。规则不是自动发送授权。

LEAD-02 编辑启停与异常呈现 [UI/FAULT]

  • 前置:至少两条规则。
  • 操作:
    1. 编辑并保存,取消编辑检查当前表单;停用规则再编辑保存并检查enabled值
    2. F1阻断规则GET,切规则页;解除阻断重进
    3. 启用/停用busy时重复点击,查看无删除按钮
  • 预期:编辑停用规则是否重新启用要显式记录,不能悄悄改变用户意图;列表失败应可识别。当前规则分支缺统一错误/空态时记缺陷,不编造重试/删除功能。

LEAD-03 一级评论展示和规则选择 [UI]

  • 前置:COL真实一级评论,含已知UID和缺UID样本(缺样本则该子项阻塞)。
  • 操作:
    1. 评论页逐项核对作者/UID/正文/来源/时间
    2. 选择一条规则触发analyze,记录返回status/reason;重复选择首条规则观察是否实际发请求
    3. 切换到线索、私信再回来,F1阻断评论读取后恢复
  • 预期:缺UID/时间明确标不可用,不能凭昵称发送;规则选择触发分析而无“分析”按钮;分析中禁止冲突选择,页签数据不串结构。

LEAD-04 完整线索判定与来源范围 [REAL/API]

  • 前置:真实Bailian已配置;参考样本分别命中主题/包含/排除/AI意向。
  • 操作:
    1. 为all/owned/competitor各建规则,对同一来源已知的评论逐项analyze
    2. 用不匹配主题、包含关键词缺失、含排除关键词、AI否定样本分别分析
    3. GET rule-results?comment_id=K&rule_id=R 与leads,检查规则快照和理由
  • 预期:来源、主题、包含/排除、AI各条件形成可解释结果;同评论多个规则聚合rule_ids而非造重复线索;主题/AI结论必须源自真实供应商响应。

LEAD-05 重复分析、禁用规则与AI失败 [UI/API/FAULT]

  • 前置:已分析K/R;原AI配置备份。
  • 操作:
    1. 重复分析同K/R,比较rule-results数量/快照;编辑R后再分析比较新快照
    2. 停用R后调用analyze;取消AI审批后分析另一评论
    3. 恢复设置,仅显式重分析,观察线索是否曾被伪造
  • 预期:重复不重复造结果实体;禁用/AI失败理由可见,无假命中。失败返回即使为503也应显示业务原因,恢复不自动执行回复。

LEAD-06 线索列表与人工联系入口 [UI]

  • 前置:至少一条真实线索,含UID。
  • 操作:
    1. 打开线索页核对原评论、作者、UID、命中规则
    2. 点击人工联系,观察是否显示回复编辑区/切评论页
    3. F1阻断leads GET后恢复,检查空态与失败
  • 预期:可追溯线索;人工联系应提供可继续的人工编辑与确认,当前仅requestReply但线索页不渲染编辑区,证实则记失败;不能通过切评论页绕过后宣称本按钮通过。

LEAD-07 评论/规则详情与只读结果 API [API]

  • 前置:附录F;真实K/W/R。
  • 操作:
    1. GET单评论、单规则及enabled_only=true列表;按platform/work_id筛评论
    2. GET rule-results分别只按comment/只按rule/组合筛选,并查不存在ID
    3. 确认分析前后无新增operation、无平台回复
  • 预期:过滤返回对应记录且详情完整;不存在资源404;分析只产生分析结果,不隐式平台写。未提供评论删除/规则删除的路径不编造。

5.15 人工写操作、私信与操作记录

OP-01 评论人工回复与逐次确认 [UI/REAL]

  • 前置:AC-06、COL真实K,发送账号、目标U1及唯一文案已批准。
  • 操作:
    1. 在评论点人工回复,选择同平台发送账号并输入完整RUN文案;分别试缺UID/账号/空白文案
    2. 有效输入进入确认框,核对账号、目标UID、完整文本,取消一次确认无operation
    3. 再次确认只发送一次,保存create和execute响应;在真实平台目标评论核对作者/正文/新评论ID
  • 预期:无效输入不发送;取消无写;成功须operation=succeeded且平台证据匹配,不能只看toast。failed/blocked/processing/uncertain分别可见且不自动重试。

OP-02 私信接收、会话及消息展示 [UI/REAL]

  • 前置:真实已登录接收账号,EVT真实通知可用;U1经授权发送一条RUN文本。
  • 操作:
    1. U1在平台发送后,读creator/events及conversations获取会话,再在工作台私信选接收账号/会话
    2. 核对对方UID、消息正文、方向/时间,非文本样本核对类型占位
    3. 停留已选会话超过20秒查看10秒GET消息,再离开页签查看timer停止
  • 预期:真实入站事件与消息关联且不串号;页面10秒读消息是当前轮询,不是平台事件监听证明;无会话不能输入发送,不存在附件/自动聊天入口。

OP-03 人工私信发送与平台证据 [UI/REAL]

  • 前置:OP-02真实会话;S1或A作为明确发送者和完整文案已批准。
  • 操作:
    1. 输入文本点确认发送,检查确认框账号/UID/完整文案,取消一次
    2. 重新确认一次,记录operation/key/execute/evidence
    3. 在收件方平台查看消息、正文及发送人,刷新本系统消息列表和操作记录
  • 预期:成功必须发送人与收件人准确,平台消息可查且系统出站消息不重复;成功清草稿/key,失败/不明保留,不自动聊天。

OP-04 草稿、切换、迟到响应与幂等 [UI/API/FAULT]

  • 前置:两账号各有真实会话、两评论;无新增写授权时只测草稿/取消。
  • 操作:
    1. 分别输入不同草稿,切账号/会话先取消再确认;刷新后切回检查各自草稿与key
    2. F2快速切换账号/会话,观察消息迟到响应归属
    3. 对已完成的OP-01/03用原body原key重复create,仅在明确终态用原ID execute核验不重发;改body保留原key观察冲突
  • 预期:草稿按评论或账号+会话隔离,切换确认可取消;同key同body复用操作,不同body409。uncertain不执行此重复execute步骤;其禁止重试另按OP-05。

OP-05 创建/执行失败、未知结果和恢复 [UI/REAL/FAULT]

  • 前置:一次故障测试写有明确授权与收件方在线;保留原key。
  • 操作:
    1. F1只阻断operations/{id}/execute,使create成功但执行未发出;恢复后先GET操作,确认未执行并再次人工确认方可继续
    2. 另独立授权写在实际execute发出后F3停gateway,保存未知/错误状态
    3. 恢复gateway,只读查operation和平台结果,等待至少两个分钟观察,不点击重试、不换key
  • 预期:创建成功不等于发送;明确未发出的请求恢复须再次确认;执行结果未知保持uncertain/待核验,不能自动重发或伪造成功;失败原因和原key可追踪。

OP-06 人工点赞、关注 API [API/REAL]

  • 前置:附录F operation;真实W/K/U1和S1已登录;每种动作独立一次授权。
  • 操作:
    1. 逐项建立source=manual的like_comment、like_work、follow操作,填写内部K/W及真实target_uid;记录201但尚不execute
    2. 人工核对body与目标后POST execute一次
    3. 从真实平台核对点赞/关注状态和evidence,再用同操作ID读取结果
  • 预期:三类动作实际生效且证据准确;无UI按钮时使用API不编造页面入口;已点赞/已关注应只确认既有状态不反向取消;每项独立记录。

OP-07 转发明确不支持、目标与身份拒绝 [API/REAL]

  • 前置:真实测试W、已批准拒绝验证;附录F。
  • 操作:
    1. 创建带文案repost并确认execute一次,检查gateway代码和目标作品
    2. 分别以错误评论所属作品、错误作者UID、自己目标、跨平台账号构造operation或gateway预览,不进行未校验写
    3. 登出/换真实浏览器身份后对已创建未执行操作execute,随后由所有者恢复登录
  • 预期:当前带文案转发明确REPOST_TEXT_UNSUPPORTED且不得产生转发,不宣称完整转发能力;身份/目标不匹配拒绝,不能拿内部ID当平台ID写给他人。

OP-08 操作记录及边界状态 [UI/API/FAULT]

  • 前置:上述操作产生succeeded/failed/blocked/uncertain等状态;附录F。
  • 操作:
    1. 打开操作记录按account_id读取,逐条核对完整状态、时间和原因;GET单operation查看evidence
    2. F1阻断列表,恢复后只点读取重试;F10补充processing/未知枚举仅观察展示
    3. 在DevTools Console临时将crypto.randomUUID与crypto.getRandomValues都覆写为undefined(仅禁用randomUUID仍有安全回退);尝试打开人工确认但不授权发送,随后整页刷新恢复原生crypto
  • 预期:状态不折叠为成功;页面没有执行/自动重试/删除按钮。无法生成安全key时应阻止发送并提示;仅浏览器注入分支单独标记,不替代真实运行证据。

5.16 真实事件监听与自动响应

EVT-01 首次监听、历史基线与四类通知 [REAL]

  • 前置:A真实logged_in、运行代际有效;自动策略先停用;U1可产生评论/点赞/关注/转发通知。
  • 操作:
    1. 留存A平台已有历史通知,再启动/重建本轮监听,观察gateway baseline与控制面日志
    2. 边界确认后U1依次触发四类各一条获准真实通知,记录event_key/type/UID/work/comment及平台时间
    3. GET /api/creator/events?account_id=A 对照通知,确认旧历史只做baseline不触发operation
  • 预期:来源为真实页面通知监听,不是人工POST事件或轮询平台通知接口;事件身份和时间可追踪,缺UID/时间/边界不允许自动写。转发入站通知与系统不支持带文案转发出站是两件事。

EVT-02 实时性与页面可见性 [REAL]

  • 前置:EVT-01真实新通知;UI打开对应评论/私信/操作页;所有时钟校准。
  • 操作:
    1. 录制平台产生时刻、gateway_received_at、received_at、processing_started_at与实际页面首次可见时刻
    2. 生成获准评论或私信事件,观察页面是否无需人工刷新即可看到;重复三次但每次独立授权
    3. 计算收到至处理/可见耗时,单列平台推送延迟;不调用display接口伪造UI时间
  • 预期:以实测记录处理≤5秒/可见≤30秒作为实时链路质量检查,超时如实失败;无事件页面、无自动展示路径时记能力缺口,不把API写displayed_at当看见。该阈值是测试观察目标,不声明当前源码保证。

EVT-03 断连重连、边界与代际替换 [REAL/FAULT]

  • 前置:真实A监听,策略先停用;F3/F7。
  • 操作:
    1. F3停止gateway,U1在断线期间产生一条获准通知,随后恢复
    2. 观察open/close/error/reconnected/baseline与退避;边界后再产生一条新通知
    3. 停止重建浏览器使generation变化,GET旧事件并核对新订阅唯一
  • 预期:断线历史/边界不明不补发;只有明确新边界后新事件可自动动作;旧订阅停止,无两个账号/代际串用。缺平台连续性证据不能标“无丢失恢复成功”。

EVT-04 事件去重、确认与崩溃恢复 [REAL/FAULT]

  • 前置:获准单事件写或策略停用;F4;已有真实event_key。
  • 操作:
    1. 在真实事件已入库后F4中断控制面,恢复监听并观察gateway未确认通知是否重投
    2. 重复读取events/operations及平台记录,对比event_key和operation id
    3. 若捕捉processing中断则等待超过2分钟及一次10秒调和,核对stale recovery
  • 预期:同平台/接收账号/event_key只有一个持久事件,不因重投自动重写;processing过期变uncertain保留冷却,不假成功。未触发ack丢失/processing窗口的子项记录阻塞,不注入假成功。

EVT-05 顺序策略和四事件匹配 [REAL]

  • 前置:A大号、S1/S2关系有效、获准低风险候选文案/动作;四类真实触发均可用。
  • 操作:
    1. 按position建立两条匹配策略,启用;U1产生对应真实新事件
    2. 核对选择首个可用策略,只一个execution_account/action及平台结果
    3. 下一独立UID/冷却结束后停用首条或让其缺目标,再触发;分别更换四类event_types验证过滤
  • 预期:按当前策略顺序选首个满足条件动作,不对同事件执行整串动作;无匹配明确unmatched、大号关闭ignored,不能因首个执行失败临时换小号补发。

EVT-06 共享冷却、候选与人工例外 [REAL]

  • 前置:A冷却先保存默认86400证据,再获准设为测试60秒;U1/U2;候选两条均批准。
  • 操作:
    1. U1触发首条动作,冷却内再触发不同事件/不同策略;检查无第二平台写
    2. U2同类事件可以独立触发;自然等待U1冷却结束再触发一条
    3. 冷却内另经OP人工逐次确认对U1回复一次;结束恢复原冷却并停策略
  • 预期:同平台大号+UID跨小号/事件/动作共享冷却,文案从候选中选一条;不同UID独立,人工不受自动冷却阻止。随机样本只证明来自候选,不以少量样本声称均匀。

EVT-07 AI生成失败、写失败与冷却保留 [REAL/FAULT]

  • 前置:无候选、有统一AI要求且真实Bailian已配置;测试失败触发已批准。
  • 操作:
    1. 启用策略,U1产生新事件并核对真实AI文本及唯一平台写证据
    2. 下一独立UID试验前取消AI审批,触发新事件,记录AI失败和冷却;恢复审批后同UID再次触发
    3. 另一独立UID的已授权动作中用F3制造失败/不明,恢复后同UID再触发
  • 预期:AI按统一要求生成实际文本;AI失败/动作失败/不明都保留冷却,不换小号补发;无候选无统一要求时不发送。供应商/网关恢复不能自动补发旧事件。

EVT-08 执行前状态变化与串行 [REAL/FAULT]

  • 前置:至少两个获准新事件,S1同执行账号;可捕捉前一个动作在途,F3可选。
  • 操作:
    1. 前一操作在途时产生第二事件,记录收到与排队情况
    2. 第二条执行前停用策略/解除关系/关闭大号/将小号禁言(每项独立轮次),观察操作和平台实际结果
    3. 恢复各原配置,确认旧事件不因此自动重发
  • 预期:同账号写串行但接收不应被慢写阻塞;执行前重新校验最新状态,已不允许的写blocked;未捕捉到等待窗口不能声称已验证状态竞争。

5.17 API-only 契约补充

API-01 作品写入与来源关联 [API]

  • 前置:仅隔离测试数据;附录F导入样例,sources为已存在A/C;不用于替代REAL采集。
  • 操作:
    1. POST works一条API前缀作品,记录201及内部ID
    2. 同platform/work_key再次POST同body,再改为另一合法source,GET详情与来源过滤
    3. 试未知来源/非法计数/缺发布时间并读取结果
  • 预期:同作品去重,合法多来源保留,未知字段/来源拒绝;发布时间缺失保留待核验而非造时间。这些记录清楚标API数据,不算平台采集通过。

API-02 指标写入、缺失值与计划 [API]

  • 前置:隔离环境、API-01 合法来源账号;另用附录 F-work-metric 创建独立作品 WM(不得复用缺发布时间的 W),发布时间 P 已标 verified,且在当前 metric_age_seconds 监测窗口内。保存完整 settings;本例放在 REAL 指标观察结束后,不能与其并行。使用当轮 UTC 时间且服务器时钟同步;不依赖后台调度。
  • 操作:
    1. 令 P 为本轮当前时间减 120 秒,初始 metric_age_seconds 大于 120 秒并留足执行余量;若不满足,保存原设置后完整 PUT settings 调整。创建 WM 后,在 P < T1 <= 服务端当前时间的条件下,POST /api/creator/works/{WM}/metrics,body 为附录指标样例并替换 collected_at=T1(含 likes=0、comments_count=null)。GET WM 详情与 metrics,记录快照及 next_metric_at
    2. 对 WM 同 T1 重复提交相同值;另提交 P < T0 < T1 的旧时间,及负数、超 int64、非法时间、未来时间各独立请求,读取快照和最新值。有效后续快照若另行补测,必须等待实际时间到达 next_metric_at,不能伪造未来时间
    3. 完整 PUT settings,仅将 metric_age_seconds 缩短为 60 秒,使 WM 超龄;GET WM,核对 next_metric_at 为空及 metric_stop_reason=monitoring_age_reached,快照保留。恢复本轮保存的完整 settings,再读取确认设置已恢复
    4. 单独对 API-01 的缺发布时间作品 W 提交一次当前时间指标并读详情/metrics,核对计数可保存但不产生监测快照,next_metric_at 为空,原因为 published_at_pending_verification;本子项不能替代 WM 的正常/超龄验收
  • 预期:WM 首次生成真实存储快照,重复 T1 不增加点;迟到旧快照被拒绝且不覆盖最新值,null 不同于 0,非法数值/时间被拒绝;缩短窗口后停止原因明确。W 的缺时间分支独立记录;两类人工导入均不证明真实平台刷新。

API-03 评论导入与关系校验 [API]

  • 前置:API-01作品,附录F comment。
  • 操作:
    1. POST top_level评论后GET单条及按work过滤;同comment_key重复提交
    2. 试unknown类型、缺author_uid,确认可保留但不具备人工写目标
    3. 提交非法comment_type、另平台work或不存在work
  • 预期:合法导入持久且去重,未知作者不丢正文、不允许冒名发送;非法关联拒绝;不通过导入伪造真实一级评论采集成功。

API-04 事件记录、处理与显示时间 [API]

  • 前置:附录F event;仅隔离、无启用策略账号或baseline=true;不执行真实写。
  • 操作:
    1. POST events同body两次,记录201/200及duplicateGET按account_id查询
    2. 用同事件POST events/process,因baseline或大号关闭只观察ignored/基线结果
    3. POST events/{id}/display后回读displayed_at;另建唯一API事件keybaseline=false且comment事件缺UID,核对blocked且无操作;再试非法事件类型/未知账号
  • 预期:记录去重且display时间可更新;API处理不证明监听,也不证明页面已显示。不得对活动自动策略发送人工构造event/process触发未授权写。

API-05 消息导入、去重与会话隔离 [API]

  • 前置:附录F message,API专用账号,不用于OP-02真实入站验收。
  • 操作:
    1. POST inbound文本消息,GET conversations?account_id及对应messages
    2. 原platform_message_key重复POST;同peer_uid另一账号再导入一条
    3. 试非法direction/sent_state/空peer_uid/不匹配平台,读页面测试数据标识
  • 预期:同消息去重,会话按账号+peer隔离;非法数据拒绝;该入口仅存储不发送平台消息,不能伪造出站succeeded证明真实发送。

API-06 公开边界、JSON与错误分类 [API]

  • 前置:只用附录请求样例和隔离数据;不发REAL execute。
  • 操作:
    1. 在各类POST/PUT复制合法body分别加入unknown字段、尾随第二对象、错误类型;试空body与超过1MiB
    2. GET各详情不存在ID,试POST路径拼错/不支持方法,记录实际HTTP和body
    3. 正确body再次只读核验原记录,检查服务日志无Cookie/token/账号密码
  • 预期:字段错误400、资源不存在404、冲突409、依赖不可用503等按对应handler语义可辨;不把HTML SPA兜底当API成功。gateway native gateway 依赖可能502,不能强求所有模块统一503。

5.18 清理

END-01 停止业务并核验真实副作用 [UI/REAL]

  • 前置:本轮所有写操作和平台证据账本完整;保留未决uncertain记录。
  • 操作:
    1. 停用本轮自动策略、关闭大号模式、暂停竞品监测;读取确认停用
    2. 逐账号按授权在平台人工删除RUN测试评论/可撤回消息/测试转发、取消测试新增点赞/关注;不可撤回项登记,不自动取消测试前已有关系
    3. 暂停测试账号,取消尚未执行Mock任务;对uncertain只留证不execute
  • 预期:不再产生新自动动作;平台清理每项有记录,无法清理明确遗留;不为清理而假核验未知结果为成功/未执行。

END-02 资源、配置与证据归档 [UI/API/FAULT]

  • 前置:END-01;所有备份和RUN资源清单。
  • 操作:
    1. 按3.2恢复全部网络/配置/文件/Overrides;回收测试browser runtime,核对Profile保留
    2. 删除未引用网关(网关用API);停用测试出口;恢复原settings/策略/业务状态并只读核对
    3. 需彻底销毁时,先停止专用Compose部署,由负责人逐一核对RUN runtime/Profile/数据库临时资源后删除本轮数据卷和Profile;导出脱敏报告
  • 预期:只清本轮资源,禁止全局docker prune或不核对就down -v;回收后仍保留环境 binding 会阻止删除被引用网关,应登记保留或在获批整套测试库销毁时一起清理,不伪造永久删除API。原始敏感证据受限,最终报告脱敏。

6. API 覆盖及请求样例

以下目录是第5节用例的执行附录,不额外计算用例数。每个写接口必须使用指定用例的前置与授权,不能把目录当成可直接批量运行的脚本。表示无请求 body。所有对象样例均为合法 JSON 结构,里面的 A/S1/C/W/K/R 等必须替换为账本真实内部 ID;平台数字 UID、作品 key 和 comment key另取真实值。返回字段不要全量复制进严格输入接口。除明确 API 补充数据外,优先使用真实采集/监听输出;标记 RUN-api-only 的样例绝不能进入 REAL 通过统计。

附录 A:网关登记与运行时能力

方法 / 路径 body或查询样例 入口 / 用例
GET /api/gateways UI、GW-01
POST /api/gateways {"name":"e2e-gw","endpoint":"http://host.docker.internal:8081","token":""}(裸机改为 http://127.0.0.1:8081);显式 token 从私密文件替换 UI、GW-01/03
PUT /api/gateways/{G} {"name":"e2e-gw-renamed","endpoint":"http://host.docker.internal:8081","token":""}(裸机改为 http://127.0.0.1:8081 UI、GW-02
DELETE /api/gateways/{G} 无;只删除未引用项 API可用,UI接线失败待复现GW-04/05

附录 B:网络出口

方法 / 路径 body或查询样例 入口 / 用例
GET /api/network-exits UI、NET-01
GET /api/network-exits/{P1} UI、NET-05
POST /api/network-exits 使用下方对象;协议分别参数化四种,host/IP/地区替换为真实测试值 UI、NET-01/02
POST /api/network-exits/{P1}/check UI、NET-03/04
POST /api/network-exits/{P2}/disable 无;停用不可通过check恢复 UI、NET-06
{"protocol":"socks5","host":"proxy.example.invalid","port":1080,"username":"","password":"","expected_public_ip":"192.0.2.10","expected_region":"测试地区"}

示例地址为保留测试地址,不是可用代理;不可直接拿它做健康正向用例。真实密码只进入本地受限请求文件。没有出口编辑/删除/启用接口;不使用旧 credential_reference 样例。

附录 C:账号与 Phase A

方法 / 路径 body或查询样例 入口 / 用例
POST /api/phase-a/accounts {"name":"RUN账号","platform":"douyin","platform_account_key":"123456789","tags":["RUN"],"cookies":""} UI、AC-01/02
GET /api/phase-a/accounts UI、AC-01
GET /api/phase-a/accounts/{A} UI、AC-03
POST /api/phase-a/accounts/{A}/pause UI、AC-04
POST /api/phase-a/accounts/{A}/resume UI、AC-04
POST /api/phase-a/accounts/{A}/revoke API-only、AC-07
POST /api/phase-a/drafts {"account_id":"A","content":"RUN Mock 文本\n第二行"} UI、AC-05
GET /api/phase-a/drafts ?account_id=A UI、AC-05
GET /api/phase-a/drafts/{D} UI、PH-01
POST /api/phase-a/confirmations {"draft_id":"D","account_version":1,"draft_version":1};版本用实时读取值 UI、PH-01/03
GET /api/phase-a/confirmations ?draft_id=D API补充确认列表、PH-01
GET /api/phase-a/confirmations/{Q} API-only详情、PH-01
POST /api/phase-a/tasks {"confirmation_id":"Q"} UI、PH-02
GET /api/phase-a/tasks ?account_id=A&draft_id=D&state=queued UIdraft_id仅API筛选、PH-05
GET /api/phase-a/tasks/{T} UI、PH-05
GET /api/phase-a/attempts/{AT} UI、PH-04/05
POST /api/phase-a/tasks/{T}/verify {"result":"not_executed"};另两值succeeded/failed UI、PH-06/07
POST /api/phase-a/tasks/{T}/resume UI、PH-06/08
POST /api/phase-a/tasks/{T}/finish UI、PH-07
POST /api/phase-a/tasks/{T}/cancel API-only、PH-09
POST /api/phase-a/mock/execute {"worker_id":"e2e-worker-1","outcome":"succeeded"};另三值failed/uncertain/policy_hold API-only、MOCK、PH-04/10
GET /api/phase-a/audit ?account_id=A&task_id=T&attempt_id=AT&browser_env_alias=e2e-env&network_exit_id=P1&event_type=task_finished&from=2026-09-13T00%3A00%3A00Z&to=2026-09-13T23%3A59%3A59Z&page=1&page_size=25;按本轮UTC替换时间,逐个条件再组合 UI、AUD-0104

附录 D:环境

方法 / 路径 body或查询样例 入口 / 用例
GET /api/browsers UI、ENV-04
GET /api/browsers/{E1} alias作为路径,不是账号ID UI、ENV-04
POST /api/browsers 下方完整对象 UI、ENV-0103
POST /api/browsers/{E1}/start UI、ENV-05
POST /api/browsers/{E1}/stop UI、ENV-05
POST /api/browsers/{E1}/rebind {"network_exit_id":"P2"} API-only、ENV-07
DELETE /api/browsers/{E1} 无;仅回收容器 UI、ENV-05/09
{
  "alias":"e2e-env","name":"RUN环境","gateway":"G","account_id":"A","network_exit_id":"P1",
  "fingerprint":{"seed":1000,"platform":"windows","platform_version":"11.0.0","brand":"Chrome","brand_version":"132.0.6834.159","hardware_concurrency":4,"lang":"zh-CN","accept_lang":"zh-CN,en-US","timezone":"Asia/Shanghai","disable_spoofing":"font,audio"}
}

最小对象只保留 fingerprint.seed,直连 network_exit_id 为空字符串。不接受客户端自己添加代理参数;PUT /api/browsers/{E1} 不是环境编辑功能。重绑要求有效出口ID,空值不能切回直连。

附录 E:采集设置、资料与策略

方法 / 路径 body或查询样例 入口 / 用例
GET /api/creator/settings UI、SET-01
PUT /api/creator/settings E-settings完整12字段 UI、SET-0104
GET /api/creator/accounts UI、STR-01
GET /api/creator/accounts/{A}/profile 无;不是 /accounts/{A} UI、STR-01
PUT /api/creator/accounts/{A}/profile E-profile UI、STR-01/07
POST /api/creator/accounts/{A}/login-result {"status":"manual_required","reason":"RUN需账号所有者人工登录","actual_platform_account_key":""};仅negative状态;logged_in用于拒绝验证 API-only、AC-06、STR-07
POST /api/creator/accounts/{A}/verify 无;核对已人工登录的受管浏览器身份 UI、AC-06
GET /api/creator/listeners ?account_id=A UI、EVT-01/02
POST /api/creator/accounts/{A}/big-account {"enabled":true} / false UI、STR-03
GET /api/creator/relations ?big_account_id=A UI、STR-03
POST /api/creator/relations {"big_account_id":"A","small_account_id":"S1","enabled":true}false解除 UI、STR-03/05
GET /api/creator/accounts/{A}/strategies UI、STR-04
POST /api/creator/accounts/{A}/strategies E-strategy UI、STR-04
PUT /api/creator/strategies/{strategy_id} E-strategy全对象,改position等字段 UI、STR-05
POST /api/creator/strategies/{strategy_id}/enable UI、STR-05
POST /api/creator/strategies/{strategy_id}/disable UI、STR-05
DELETE /api/creator/strategies/{strategy_id} UI、STR-05

E-settings(只作结构样例;恢复时使用本轮保存的原值):

{"lookback_days":30,"new_work_interval_seconds":1800,"metric_initial_interval_seconds":3600,"metric_multiplier":2,"metric_max_interval_seconds":86400,"metric_age_seconds":2592000,"ai_provider":"","ai_model":"","ai_configured":false,"transcription_provider":"","transcription_model":"","transcription_configured":false}

E-profile

{"login_username":"RUN测试用户","password":"","real_name_status":"unknown","real_name":"","identity_number":"","note":"RUN","business_status":"normal","big_account":false,"reply_requirements":"仅回复已批准测试内容","cooldown_seconds":86400}

资料 PUT 需要保留本轮真实 big_account 等原值,不可把示例 false 发到活跃大号。密码空表示不更新;真密码不写入报告。实名状态为 unknown/not_real_name/recorded;人工业务状态为 normal/muted/banned/deleted,不以中文label猜枚举。

E-strategy

{"execution_account_id":"S1","position":1,"enabled":false,"event_types":["comment"],"action":"reply_comment","target_type":"user","candidate_texts":["RUN已批准候选一","RUN已批准候选二"]}

like_comment 使用 target_type=commentlike_work/repost 使用 work;其他动作服务端规范为 user(回复仍须实际comment/work目标)。event_types 为 comment/like/repost/followUI不配置自动DM聊天。示例默认停用,获准真实事件测试时才显式启用。

附录 F:竞品、内容、素材、线索、事件与消息

方法 / 路径 body或查询样例 入口 / 用例
GET /api/creator/competitors ?platform=douyin UI、COL-01
GET /api/creator/competitor-share-jobs ?status=failed&platform=douyin UI、COL-01
POST /api/creator/competitor-share-jobs {"platform":"douyin","share_url":"https://v.douyin.com/...","tags":["重点监测"]} UI、COL-01;立即入队,后台最多尝试3次
GET /api/creator/competitor-share-jobs/{J} UI、COL-01;查询状态与失败原因
POST /api/creator/competitor-share-jobs/{J}/retry UI、COL-01;失败任务重新入队
GET /api/creator/competitors/{C} API-only详情、COL-01/02
POST /api/creator/competitors/{C}/pause UI、COL-02
POST /api/creator/competitors/{C}/resume UI、COL-02
POST /api/creator/competitors/{C}/sync {"account_id":"A"} UI、COL-02/03/09
GET /api/creator/works ?platform=douyin&source_type=competitor&source_id=C&published_after=2026-09-01T00%3A00%3A00Z&published_before=2026-09-14T00%3A00%3A00Z&min_likes=0&min_comments=0&min_shares=0;时间换本轮窗口 UI仅平台/计数,其余API-only筛选COL-07
POST /api/creator/test/works F-work;仅隔离测试补充数据 API-only导入、API-01;生产入口拒绝客户端伪造
GET /api/creator/works/{W} API-only详情、COL-07
GET /api/creator/works/{W}/metrics API-only快照、COL-08、API-02
POST /api/creator/works/{W}/metrics {"collected_at":"2026-09-13T12:00:00Z","likes":0,"comments_count":null,"shares":1};当轮时间 API-only导入、API-02
GET /api/creator/works/{W}/material UI、MAT-01
POST /api/creator/works/{W}/material/select UI、MAT-01
POST /api/creator/works/{W}/material/process 无;会真实下载/处理文件 UI、MAT-0204
POST /api/creator/works/{W}/material/rewrite/confirm {"requirement":"RUN保留事实,使用测试口播风格"} UI、MAT-05/06
POST /api/creator/works/{W}/material/rewrite/generate 无;需 AI 设置已批准 UI、MAT-05/06
PUT /api/creator/works/{W}/material/rewrite {"title":"RUN人工编辑标题","script":"RUN人工编辑口播正文"} UI、MAT-05/06
GET /api/creator/comments ?platform=douyin&work_id=W UI、LEAD-03/07
POST /api/creator/test/comments F-comment 隔离测试导入、API-03;生产入口拒绝客户端伪造
GET /api/creator/comments/{K} API-only详情、LEAD-07
GET /api/creator/rules 无,或 ?enabled_only=true UI及API-only启用过滤、LEAD-01/07
POST /api/creator/rules F-rule UI、LEAD-01
GET /api/creator/rules/{R} API-only详情、LEAD-07
PUT /api/creator/rules/{R} F-rule全对象 UI、LEAD-02
POST /api/creator/rules/{R}/enable UI、LEAD-02
POST /api/creator/rules/{R}/disable UI、LEAD-02
GET /api/creator/rule-results ?comment_id=K&rule_id=R API-only结果详情、LEAD-04/07
GET /api/creator/leads ?platform=douyin UI、LEAD-04/06
POST /api/creator/comments/analyze {"comment_ids":["K1","K2"],"rule_id":"R"} UI批量分析、LEAD-0305
GET /api/creator/events ?account_id=A API-only、EVT、API-04
POST /api/creator/test/events F-event 隔离测试导入、API-04;不证明监听
POST /api/creator/test/events/process F-event;仅隔离测试,可触发真实写 隔离测试、API-04;不证明监听
POST /api/creator/events/{event_id}/display API-only、API-04;不作为实际页面可见证据
GET /api/creator/operations ?account_id=S1 UI、OP-08
POST /api/creator/operations F-operation UI回复/私信;其他动作API-only、OP-0107
GET /api/creator/operations/{operation_id} API-only详情、OP-04/05/08
POST /api/creator/operations/{operation_id}/execute 无;仅在逐次确认/已批准API动作后执行 UI或API、OP-0107
GET /api/creator/conversations ?account_id=A UI、OP-02
GET /api/creator/conversations/{conversation_id}/messages UI、OP-02/03
POST /api/creator/test/messages F-message;仅隔离测试存储,不发平台消息 隔离测试导入、API-05

F-competitor(主页与标识换为C真实资料;这里不是一键解析真实身份):

{"platform":"douyin","platform_account_key":"C真实稳定标识","nickname":"RUN竞品","avatar_url":"","homepage_url":"https://www.douyin.com/user/C真实sec_user_id"}

F-work(仅API补充;source_id必须是已有合法A;不可拿示例媒体地址做真实处理):

{"platform":"douyin","work_key":"RUN-api-only-work-1","source_type":"owned","source_id":"A","author_name":"RUN-api-only","title":"RUN-api-only测试作品","body":"仅验证存储,不是采集结果","published_at":null,"published_at_status":"pending_verification","original_url":"https://www.douyin.com/video/123456789","cover_url":"","likes":0,"comments_count":null,"shares":0}

F-work-metricAPI-02 专用独立作品 WM;其余字段同 F-work。以下时间必须替换为本轮 UTC 当前时间减 120 秒,并保证初始监测窗口足够长;verified 只代表本条 API 测试数据的显式输入,不证明真实采集已验证发布时间):

{"platform":"douyin","work_key":"RUN-api-only-metric-work-1","source_type":"owned","source_id":"A","author_name":"RUN-api-only","title":"RUN-api-only指标测试作品","body":"仅验证指标存储与计划","published_at":"2026-09-13T11:58:00Z","published_at_status":"verified","original_url":"https://www.douyin.com/video/123456789","cover_url":"","likes":0,"comments_count":null,"shares":0}

F-commentW取API-01输出;REAL用例必须取真实采集K):

{"platform":"douyin","comment_key":"RUN-api-only-comment-1","work_id":"W","author_uid":"123456789","author_name":"RUN-api-only","content":"RUN-api-only想了解测试商品","published_at":null,"comment_type":"top_level"}

F-rule

{"name":"RUN线索规则","enabled":true,"source_type":"all","topic":"测试商品","include_keywords":["了解","咨询"],"exclude_keywords":["广告"],"ai_requirement":"只判断明确咨询测试商品的评论,不执行发送"}

F-event(仅隔离API补充;不篡改真实事件时间/状态):

{"platform":"douyin","receiving_account_id":"A","event_key":"RUN-api-only-event-1","event_type":"comment","baseline":true,"interactor_uid":"123456789","comment_id":"","work_id":"","message_text":"","platform_event_at":null}

F-operation(内部K/W来自真实采集;target_uid为评论真实作者数字UID;key由前端或API测试客户端安全随机生成,示例key只说明字段,不可多条动作复用):

{"idempotency_key":"manual-本轮安全随机唯一键","source":"manual","action":"reply_comment","platform":"douyin","account_id":"S1","target_uid":"123456789","target_comment_id":"K","target_work_id":"W","text":"RUN已批准的一次测试回复"}

其他动作每项单独生成key

action 应填目标字段 text execute预期
dm target_uidcomment/work省略 已批准非空文案 真实收件方可见、消息证据
like_comment target_uid、target_comment_id、target_work_id 正确评论被点赞,不取消已点赞
like_work target_uid(已核对的作品作者数字UID)、target_work_idcomment可省略 正确作品被点赞
follow target_uid 正确账号被关注,不取消已关注
repost target_uid(已核对的作品作者数字UID)、target_work_id 已批准非空文案 当前明确失败 REPOST_TEXT_UNSUPPORTED,零转发副作用

所有 action 在创建阶段均要求非空 target_uid。另分别省略 like_work/repost 的 target_uid 提交创建请求,预期 400 且不产生可执行操作;此拒绝子项不得作为正向点赞或转发 REPOST_TEXT_UNSUPPORTED 边界的输入。

F-message(仅隔离API存储,platform_message_key带API标记;message_at改本轮时间):

{"platform":"douyin","account_id":"A","peer_uid":"123456789","peer_name":"RUN-api-only","platform_message_key":"RUN-api-only-message-1","direction":"inbound","message_type":"text","text":"RUN-api-only仅测试存储","sent_state":"received","message_at":"2026-09-13T12:00:00Z"}

附录 Ggateway 内部领域路由

这些接口不经 /api;独立实验用例才直接调用,正常业务优先从控制面进入。GATEWAY_BASE 的可达方式见3.1。除 GET /v1/browsers 外,领域GET/DELETE也要提交 JSON body及Content-Length,不能照普通GET省略。

代际获取:控制面 GET /api/browsers/{E1} 返回对象内运行记录的 binding_version(先按实际JSON层级读取),与 gateway GET /v1/browsers 中同alias的 idnetwork_idnetwork_exit_id 共同核验;id是gateway runtime ID,不是控制面 runtime_instance_id。实际字段回读与 runtime metadata 一致后再填请求。不存在时不得随意填 1/假ID来做成功测试。

G-generationstart/stop/remove仅这三字段,不能混入network_exit_id):

{"binding_version":1,"runtime_id":"实际 runtime ID","network_id":"实际 network ID"}

G-douyin-basecookies/get/identity/action/events均在此对象上加各自字段;直连出口为空,但仍须真实network_id):

{"binding_version":1,"runtime_id":"实际 runtime ID","network_id":"实际 network ID","network_exit_id":"P1"}
方法 / 路径 请求样例 / 在base上追加字段 用例
GET /healthz 无、无需token204 SYS-01
GET /v1/browsers GATE-01/02
POST /v1/browsers G-create GATE-02
POST /v1/browsers/{alias}/start G-generation;要求非空有效network_id,停止态未联网容器不满足该前置 GATE-02
POST /v1/browsers/{alias}/stop G-generation GATE-02
DELETE /v1/browsers/{alias} G-generation;缺失容器专项可不填runtime/network,但必须按已保存代际核验 GATE-02
POST /v1/browsers/{alias}/proxy G-proxy GATE-03
POST /v1/browsers/{alias}/douyin/cookies G-douyin-base + "cookies":[{"name":"sessionid","value":"仅在私密请求文件填入","domain":".douyin.com","path":"/"}] GATE-04
POST /v1/browsers/{alias}/douyin/get G-douyin-base + "url":"https://www.douyin.com/aweme/v1/web/user/profile/self/?aid=6383&device_platform=webapp" GATE-04
POST /v1/browsers/{alias}/douyin/identity G-douyin-base + "expected_account_key":"实际UID或已核实账号标识" AC-06、GATE-04
POST /v1/browsers/{alias}/douyin/messages G-douyin-base + "expected_uid":"真实数字UID","target_uid":"真实对端UID","limit":200;只读平台 IM 历史,必须返回 history_sourcehistory_has_more GATE-04、A6
POST /v1/browsers/{alias}/douyin/action G-actionconfirm默认false,不得直接把预览改true绕开授权 GATE-05、OP-07
POST /v1/browsers/{alias}/douyin/events G-douyin-base + "expected_uid":"真实数字UID" GATE-06
GET /v1/browsers/{alias}/douyin/events body=G-douyin-basequery ?limit=100&wait=25;确认 ?ack=实际delivery_id&limit=1&wait=0 GATE-06
DELETE /v1/browsers/{alias}/douyin/events body=G-douyin-base GATE-06

受限作品/评论/目标账号读取在 G-douyin-base 中增加 url

  • 目标账号:https://www.douyin.com/aweme/v1/web/user/profile/other/?aid=6383&device_platform=webapp&user_id=实际UID,或将 user_id 换成 sec_user_id;只允许这两个身份参数之一。
  • 作品:https://www.douyin.com/aweme/v1/web/aweme/post/?sec_user_id=实际sec_user_id&count=20&max_cursor=0;下一页仅使用真实返回cursor。
  • 一级评论:https://www.douyin.com/aweme/v1/web/comment/list/?aweme_id=实际平台work_key&count=20&cursor=0;下一页同理。
  • 不允许其他host、额外参数、任意CDP或脚本。源码当前允许非负数字分页,不采用旧文档“只能max_cursor=0”的描述。

G-create(独立实验alias,不与ENV共用;gateway 运行时换真实摘要。stopped=true仅允许直连;运行态实验需要受控网络并明确授权):

{"alias":"e2e-gate-only","name":"RUN gateway实验","image":"registry.example.invalid/test/browser:approved","cmd":["--fingerprint=1000","about:blank"],"volume":"creatorhub-profile-e2e-gate-only","binding_version":1,"network_exit_id":"","network_exit":{},"stopped":true}

G-proxy

{"binding_version":1,"runtime_id":"实际 runtime ID","network_id":"实际 network ID","network_exit_id":"P1","network_exit":{"protocol":"socks5","host":"proxy.example.invalid","port":1080,"username":"","password":""}}

G-actiongateway字段使用平台标识,不是内部K/W;仅预览):

{"binding_version":1,"runtime_id":"实际 runtime ID","network_id":"实际 network ID","network_exit_id":"P1","expected_uid":"真实发送账号UID","action":"reply_comment","target_uid":"真实作者UID","target_comment_id":"真实平台comment_key","target_work_id":"真实平台work_key","text":"RUN已批准文本","confirm":false}

GET带body调用示例(仅在后续执行时,BODY_FILE为替换后的G-douyin-base,认证配置含Bearer):

curl --silent --show-error --config "$GATEWAY_AUTH_FILE" \
  -X GET -H 'Content-Type: application/json' --data-binary @"$BODY_FILE" \
  --dump-header "$EVIDENCE/headers.txt" --output "$EVIDENCE/body.json" \
  --write-out '%{http_code}\n' "$GATEWAY_BASE/v1/browsers/$ALIAS/douyin/events?limit=100&wait=25"

7. 源码已知边界与待验证风险

这里不写执行结论。首次实际执行必须按相应用例存证,不得把风险描述复制成“已复现”。

项目 基线事实 / 风险 对应判定
首次已验证登录闭环 新账号unknown;公开login-result拒绝logged_in;采集/写/监听又要求logged_in。人工浏览器登录到控制面资料的可达路径需验证 AC-06;不能改库解决测试前置
网关 UI 删除 gateway 删除必须只回收 runtime,保留 Profile 与正式结果;页面状态和 API 结果分开核对 GW-04 失败与 GW-05 API 成功分开
线索人工联系 线索页未渲染回复编辑区、没有自动切评论页 LEAD-06,不能把手动绕路当通过
规则错误区、依赖失败 多处辅助列表失败可能退化空数据/准备提示 UI-06、LEAD-02、ENV-03
仿写 确认只保存要求;PUT缺Content-Type,但服务端直接JSON解码;切换/确认后表单一致性需实测 MAT-05/06,不期待自动生成
竞品与指标目标 canonical账号转换与目标作者之间存在需核验的路径 COL-03/08,正向必须正确采C,不采执行账号冒充
媒体链 原始URL可能为网页、音轨临时后缀与格式、transcript字段内容及页面展示需核验 MAT-02,要求有效媒体/音轨/真实正文,不以状态通过
带文案转发 当前脚本明确REPOST_TEXT_UNSUPPORTED OP-07验证明确拒绝;不宣称正向支持
通知实时性 有真实通知监听代码;控制面取gateway队列与UI每10秒读私信是不同机制;display API不是UI自动上报 EVT-01~04,保留真实外部依赖与时限证据
未知hold 页面警告“不提供恢复”与allowed_action按钮可能冲突 PH-08仅UI异常响应注入检查,不对假响应执行写
直连升级/重绑 create/start支持直连,不代表upgrade空出口和rebind切直连支持 ENV-07记录实际限制
接口/页面范围 无退出、永久环境删除、作品详情UI、操作记录重发、新建会话或自动聊天入口 不编造按钮;目录中API-only补足现有后端功能

8. 结果记录、证据与通过标准

8.1 每例结果模板

复制下表,每例及每个参数化子项各一行。不要把多协议、四种Mock结果、六类动作合并成一个“通过”。

RUN / 用例 / 子项 层级 HEAD / gateway runtime 执行人 / UTC起止 前置账号与资源ID 授权单 实际有序操作 HTTP/operation/event/Attempt ID 实际UI与平台结果 证据路径 状态 缺陷/阻塞及恢复清理
待填写 UI/API/REAL/MOCK/FAULT 待填写 待填写 脱敏ID 无写填不适用 记录实际步骤,不只复制计划 无则说明原因 不以“正常”代替事实 脱敏截图/响应/日志索引 未执行 待填写

单例详细记录:

用例:
前置满足情况 / 数据真实来源:
授权动作与次数(含平台清理授权):
步骤1 实际操作、时间、结果:
步骤2 实际操作、时间、结果:
步骤3 实际操作、时间、结果:
请求方法/路径/脱敏body/HTTP状态:
账号ID / 平台UID / 环境alias / binding_version / runtime_id
任务 / confirmation / attempt / operation / idempotency_key / event_key
预期与实际差异:
平台侧独立核验:
故障注入具体命令与时刻 / 恢复命令与时刻:
证据索引(不得包含明文凭据):
结论:通过 / 失败 / 阻塞 / 未执行 / 经批准不适用
遗留风险与负责人:
清理确认:

实时事件另附:平台事件时间、gateway收到、控制面收到、开始/完成处理、UI实际首次可见、平台推送延迟、处理延迟、可见延迟。页面无展示入口则写“没有可观察入口”,不手工填displayed_at制造≤30秒。

证据至少包括:对应HEAD/digest、实际URL、关键步骤截图、脱敏请求响应、服务关联日志、平台侧独立截图或ID、故障恢复记录;素材附真实文件校验(ffprobe格式/时长/采样率)、转写正文与参考文稿差异。状态 succeeded 但缺平台写后证据/媒体实物,不能通过REAL用例。

8.2 状态与验收门槛

  1. 通过:前置真实且授权有效,全部步骤预期满足,有独立可复核证据,重复/失败分支及清理均有记录。
  2. 失败:实际行为与预期不符,包括静默吞错、串账号、重复写、错误目标、假成功、界面现有入口无法继续。已知源码风险复现仍是失败。
  3. 阻塞:缺真实账号/登录闭环、媒体/供应商、可控代理、平台挑战待人工、故障窗口未触发等;写明原因、需要谁提供什么。不得记通过或随意不适用。
  4. 不适用:仅需求已明确排除且负责人书面确认的子项;小红书没有编入用例总数。不得把当前已实现但真实未验证的能力标不适用。
  5. 模块通过要求全部适用子项通过;全量通过要求全部范围内模块通过、无未关闭的错误目标/重复写/数据丢失/伪成功/关键入口阻断,全部真实写逐项可核验。接口补充、MOCK及UI注入分别统计,不能抵扣REAL阻塞。
  6. 已确认不支持的带文案转发可以通过“拒绝边界”检查,但总体报告必须显著保留正向不支持结论;不得据此宣布具备全六类真实写能力。
  7. 首次登录、网关UI删除、线索联系、媒体或实时展示等若阻塞/失败,即使其余模块通过,也只报告“已完成部分功能验证”,不能称“当前全量E2E通过”。
  8. 问题修复后换新HEAD重新执行失败用例及关联回归,保留旧结果,不把本基线报告改成新版本已通过。

8.3 汇总模板

模块 总用例/子项 通过 失败 阻塞 未执行 批准不适用 REAL通过/总数 主要遗留
按第4节逐模块填写 待填 0 0 0 待填 0 0/待填 尚未执行

发布结论应列:本轮实际覆盖、明确未覆盖、失败/阻塞项、剩余真实副作用与资源、配置是否恢复、证据位置、允许后续执行范围。本次文档交付只代表静态计划完成,不代表任何功能已经执行或通过。