后端生成闸+多项修复;前端全站更新;QA 审计与报告

后端:
- 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口
  一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失
- 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复
- 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令
- 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令)

前端:全站页面更新(pipeline/library/products/projects/team/account 等),
新增共享 pager 分页组件

QA:刷新 function-audit 全量输出,新增 full-qa 报告
文档:BP 产品介绍资料、design/CLAUDE.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-15 10:06:15 +08:00
co-authored by Claude Fable 5
parent 890cb9ab67
commit 216a711291
92 changed files with 5114 additions and 2027 deletions
+159
View File
@@ -0,0 +1,159 @@
"""资金核算审计:针对真实 DB,逐条验证账目不变量,任何不平即报。
跑法:cd backend && DJANGO_SETTINGS_MODULE=airshelf.settings.development .venv/bin/python ../qa/audit_billing.py
不变量:
I1 余额自洽 balance == Σ(recharge+refund) - Σ(charge) + Σ(adjustment 带符号)
I2 冻结自洽 reserved_balance == Σ(amount of ACTIVE reservations)
I3 非负 & 可用 balance>=0, reserved>=0, balance>=reserved(可用余额>=0)
I4 预留闭环 每个 reservation 状态与其 ledger 一致;CHARGED 恰好 1 条 charge 且 amount<=预留
I5 失败不扣费 失败 task 的 reservation 不得为 CHARGED
I6 无重复扣费 同一 task 不得有 >1 条 charge ledger
I7 流水连续 按时间重放,recharge/charge 的 balance_after 与重放值一致
"""
import os, sys
from decimal import Decimal
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "backend"))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "airshelf.settings.development")
import django # noqa: E402
django.setup()
from django.db.models import Sum # noqa: E402
from apps.billing.models import CreditAccount, CreditLedger, CreditReservation # noqa: E402
from apps.ai.models import AITask # noqa: E402
Z = Decimal("0")
problems = []
def flag(account, code, msg):
problems.append((str(account.team), code, msg))
print(f" ✗ [{code}] {msg}")
def audit_account(acct):
team = acct.team
led = CreditLedger.objects.filter(team=team)
print(f"\n== team={team} | balance={acct.balance} reserved={acct.reserved_balance} ==")
def s(t):
return led.filter(ledger_type=t).aggregate(x=Sum("amount"))["x"] or Z
recharge, charge, refund, adjustment = s("recharge"), s("charge"), s("refund"), s("adjustment")
# I1 余额=流水终点:account.balance 应等于最后一条动-balance 流水的 balance_after(不依赖开户 genesis)
last_bal_led = led.filter(ledger_type__in=["recharge", "refund", "charge", "adjustment"]).order_by("created_at", "id").last()
if last_bal_led is not None:
if acct.balance != last_bal_led.balance_after:
flag(acct, "I1", f"账户余额与流水终点脱节:account.balance={acct.balance} 但末条动账流水 balance_after={last_bal_led.balance_after}")
else:
print(f" ✓ I1 余额=流水终点 {acct.balance}")
else:
print(f" · I1 无动账流水(纯开户额度 {acct.balance})")
# I2 冻结自洽
active_sum = CreditReservation.objects.filter(team=team, status="active").aggregate(x=Sum("amount"))["x"] or Z
if acct.reserved_balance != active_sum:
flag(acct, "I2", f"冻结不平:account.reserved_balance={acct.reserved_balance} 但 ACTIVE 预留之和={active_sum}(差 {acct.reserved_balance - active_sum})")
else:
print(f" ✓ I2 冻结自洽 ACTIVE 预留之和={active_sum}")
# I3 非负 & 可用
if acct.balance < Z:
flag(acct, "I3", f"余额为负 {acct.balance}")
if acct.reserved_balance < Z:
flag(acct, "I3", f"冻结为负 {acct.reserved_balance}")
if acct.balance < acct.reserved_balance:
flag(acct, "I3", f"可用余额为负:balance {acct.balance} < reserved {acct.reserved_balance}")
if acct.balance >= Z and acct.reserved_balance >= Z and acct.balance >= acct.reserved_balance:
print(f" ✓ I3 非负&可用余额>=0(可用 {acct.balance - acct.reserved_balance})")
# I4/I5/I6 预留闭环 + 失败不扣 + 无重复扣
i4 = i5 = i6 = True
for r in CreditReservation.objects.filter(team=team).select_related("task"):
charges = led.filter(task=r.task, ledger_type="charge")
charge_sum = charges.aggregate(x=Sum("amount"))["x"] or Z
adj = led.filter(task=r.task, ledger_type="adjustment").aggregate(x=Sum("amount"))["x"] or Z
net_charge = charge_sum - adj # 扣费扣除回冲后的净额
dup_reconciled = charges.count() > 1 and net_charge == r.amount
if charges.count() > 1:
if dup_reconciled:
print(f" · I6 task={str(r.task_id)[:8]} 历史双扣 {charges.count()} 笔,已被 adjustment 回冲(净扣 {net_charge} = 预留 {r.amount},账平)")
else:
i6 = False
flag(acct, "I6", f"task={str(r.task_id)[:8]} {charges.count()} 条扣费,净扣 {net_charge} != 预留 {r.amount}(未完全回冲,真多扣)")
if r.status == "charged":
if charges.count() != 1 and not dup_reconciled:
i4 = False
flag(acct, "I4", f"reservation(task={str(r.task_id)[:8]}) 状态 CHARGED 却有 {charges.count()} 条扣费")
elif net_charge > r.amount:
i4 = False
flag(acct, "I4", f"净扣费 {net_charge} > 预留 {r.amount}(task={str(r.task_id)[:8]})")
elif r.status == "active":
if charges.exists():
i4 = False
flag(acct, "I4", f"reservation ACTIVE 却已有扣费(task={str(r.task_id)[:8]})")
# I5 失败不扣费
task = r.task
if task and task.status in ("failed", "cancelled") and r.status == "charged":
i5 = False
flag(acct, "I5", f"失败/取消 task={str(r.task_id)[:8]}(status={task.status})却被扣费")
if i4:
print(" ✓ I4 预留状态与扣费/释放流水一致")
if i5:
print(" ✓ I5 失败/取消任务均未扣费")
if i6:
print(" ✓ I6 无重复扣费")
# I7 逐笔差分自洽(不依赖开户起点):每条动账流水的 balance_after 必须 = 前一条动账流水的 balance_after ± 本笔金额。
# reserve/release 不动 balance,其 balance_after 应 = 当时余额快照(上一条动账流水的 balance_after)。
i7 = True
prev_bal = None # 上一条动账后的余额
for L in led.order_by("created_at", "id"):
if L.ledger_type in ("recharge", "refund", "adjustment"):
expected = (prev_bal if prev_bal is not None else Z) + L.amount
if prev_bal is not None and L.balance_after != expected:
i7 = False
flag(acct, "I7", f"差分不符 {L.ledger_type}@{str(L.created_at)[:19]} amount={L.amount} 记录={L.balance_after} 应为前值{prev_bal}+{L.amount}={expected}")
prev_bal = L.balance_after
elif L.ledger_type == "charge":
if prev_bal is not None:
expected = prev_bal - L.amount
if L.balance_after != expected:
i7 = False
flag(acct, "I7", f"差分不符 charge@{str(L.created_at)[:19]} amount={L.amount} 记录={L.balance_after} 应为前值{prev_bal}-{L.amount}={expected}")
prev_bal = L.balance_after
else: # reserve / release:不动 balance,快照应等于上一条动账后的余额
if prev_bal is not None and L.balance_after != prev_bal:
i7 = False
flag(acct, "I7", f"reserve/release 余额快照漂移@{str(L.created_at)[:19]} 记录={L.balance_after} 应={prev_bal}")
if i7:
print(" ✓ I7 逐笔差分自洽(每条 balance_after = 前一条 ± 本笔金额)")
# I8 流水完整性(可审计):首条流水之前的隐含余额应为 0(开户额度也应有 genesis 流水)
first = led.order_by("created_at", "id").first()
if first is not None:
delta = first.amount if first.ledger_type in ("recharge", "refund", "adjustment") else (-first.amount if first.ledger_type == "charge" else Z)
opening = first.balance_after - delta
if opening != Z:
flag(acct, "I8", f"开户额度无流水凭证:首条流水前隐含余额={opening}(应为 0,缺 genesis 赠送流水)")
else:
print(" ✓ I8 流水完整(开户额度有凭证)")
def main():
accts = CreditAccount.objects.select_related("team").all()
print(f"审计 {accts.count()} 个团队账户…")
for a in accts:
audit_account(a)
print("\n" + "=" * 60)
if problems:
print(f"发现 {len(problems)} 处账目问题:")
for team, code, msg in problems:
print(f" [{code}] {team}: {msg}")
sys.exit(1)
print("✓ 全部账户账目自洽,无金额核算错误")
if __name__ == "__main__":
main()
+50
View File
@@ -0,0 +1,50 @@
"""一次性回填:给历史账户补开户赠送的 genesis 流水(只补凭证,不改任何余额)。
对每个 account,若"首条流水之前的隐含余额">0 且尚无 trial_grant 流水,补一条 RECHARGE,
created_at 设为开户时间(早于所有流水),balance_after=该隐含开户额度。幂等可重跑。
跑法:cd backend && DJANGO_SETTINGS_MODULE=airshelf.settings.development .venv/bin/python ../qa/backfill_genesis_ledger.py
"""
import os, sys
from decimal import Decimal
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "backend"))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "airshelf.settings.development")
import django # noqa: E402
django.setup()
from django.db import transaction # noqa: E402
from apps.billing.models import CreditAccount, CreditLedger # noqa: E402
Z = Decimal("0")
fixed = 0
for acct in CreditAccount.objects.select_related("team").all():
led = CreditLedger.objects.filter(team=acct.team)
if led.filter(metadata__kind="trial_grant").exists():
continue # 已有 genesis
first = led.order_by("created_at", "id").first()
if first is None:
# 纯开户无任何流水:开户额度即 balance
opening = acct.balance
genesis_time = acct.created_at
else:
delta = first.amount if first.ledger_type in ("recharge", "refund", "adjustment") else (-first.amount if first.ledger_type == "charge" else Z)
opening = first.balance_after - delta
genesis_time = acct.created_at if acct.created_at < first.created_at else first.created_at
if opening <= Z:
continue
with transaction.atomic():
g = CreditLedger.objects.create(
team=acct.team,
user=acct.team.owner,
ledger_type=CreditLedger.Type.RECHARGE,
amount=opening,
balance_after=opening,
reason="新用户试用额度赠送(历史回填)",
metadata={"kind": "trial_grant", "backfilled": True},
)
# created 字段由 auto_now_add 控制,需手动回拨到开户时刻,保证它排在所有流水之前
CreditLedger.objects.filter(id=g.id).update(created_at=genesis_time)
fixed += 1
print(f" + {acct.team} 补 genesis ¥{opening} @ {genesis_time:%Y-%m-%d %H:%M}")
print(f"\n回填完成:{fixed} 个账户补齐 genesis 流水(余额未变动)")
+3 -1
View File
@@ -46,7 +46,9 @@ fs.mkdirSync(outDir, { recursive: true });
// 只跳「单击即不可逆」的真实付费/真生成/真导出 + 弹窗里的最终确认按钮。
// 触发型(删除/移除/下线/充值/退出登录 = 点了只是开二次确认弹窗或跳转)不在此列,照常点验。
const DESTRUCTIVE = /(微信支付|支付宝|立即支付|去支付|确认支付|确认充值|立即生成|生成脚本|生成基础资产|生成故事板|生成分镜|提交片段|提交视频|提交生成|提交导出|重新导出|导出\s*MP4|确认删除|确认移除|确认退出|确认下线)/i;
// ★ 2026-06-10 教训:漏了「整体重写/AI 全生/重新生成/重跑/确认脚本」,一轮审计对演示项目真跑了
// 6 次 generate-script(真扣费 ¥6)。凡单击即触发真实 AI 生成/落库写的按钮文字必须进这张表。
const DESTRUCTIVE = /(微信支付|支付宝|立即支付|去支付|确认支付|确认充值|立即生成|生成脚本|生成基础资产|生成故事板|生成分镜|提交片段|提交视频|提交生成|提交导出|重新导出|导出\s*MP4|确认删除|确认移除|确认退出|确认下线|整体重写|AI\s*全生|重新生成全部|重跑|开始生成视频|确认脚本|跳过故事板|采用此版本|AI\s*生成(三视图|人物|场景)|保存草稿|删除本场|添加分镜|发送|^生成$)/i;
async function login() {
if (TOKEN) return TOKEN;
@@ -2,15 +2,15 @@
"name": "account",
"route": "/account",
"url": "http://127.0.0.1:5173/account",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 26,
"works": 21,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 2,
"noop": 3,
"skipped": 5,
"noop": 1,
"blocked": 0
},
"results": [
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -270,17 +270,17 @@
"idx": 14,
"tag": "div",
"role": "button",
"cls": "recharge-card.selected",
"cls": "recharge-card.",
"label": "推荐¥500+ ¥30 赠送",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"self": true,
"mutations": 9,
"api": 0
}
},
@@ -401,7 +401,7 @@
"tag": "button",
"role": "",
"cls": "tab.",
"label": "账单流水 100",
"label": "账单流水 254",
"href": "",
"disabled": false,
"active": false,
@@ -416,64 +416,27 @@
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "chip.active",
"label": "日",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "chip",
"label": "周",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 38,
"api": 1
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 25,
"tag": "button",
"role": "",
"cls": "chip",
"label": "月",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 38,
"api": 1
}
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"账户",
"账单流水 30天"
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户"
]
}
@@ -1,16 +1,15 @@
# 功能审计 · account
路由:`/account` · 模式:isolated
合计 26 · ✅ works 21 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)2 · ◷ noop-active 3 · ⚪ disabled 0
路由:`/account` · 模式:quick
合计 26 · ✅ works 20 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)5 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 账单流水 30天
## ⏭ 破坏性按钮(未自动点,需人工验)
- 微信支付 `button`
@@ -2,15 +2,15 @@
"name": "asset-factory",
"route": "/asset-factory",
"url": "http://127.0.0.1:5173/asset-factory",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 24,
"works": 22,
"works": 23,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 2,
"noop": 1,
"blocked": 0
},
"results": [
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "收窄导航",
"label": "展开导航",
"href": "",
"disabled": false,
"active": false,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -338,7 +338,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 10,
"mutations": 23,
"api": 0
}
},
@@ -356,7 +356,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 11,
"mutations": 30,
"api": 0
}
},
@@ -365,7 +365,7 @@
"tag": "div",
"role": "button",
"cls": "tab",
"label": "失败 0",
"label": "失败 5",
"href": "",
"disabled": false,
"active": false,
@@ -374,7 +374,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 10,
"mutations": 24,
"api": 0
}
},
@@ -398,13 +398,13 @@
},
{
"idx": 21,
"tag": "button",
"role": "",
"cls": "chip",
"label": "任务类型",
"tag": "div",
"role": "button",
"cls": "mi.selected",
"label": "全部时间",
"href": "",
"disabled": false,
"active": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
@@ -418,8 +418,8 @@
"idx": 22,
"tag": "button",
"role": "",
"cls": "",
"label": "网格",
"cls": "clear-filters",
"label": "清空筛选",
"href": "",
"disabled": false,
"active": false,
@@ -428,7 +428,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 26,
"mutations": 16,
"api": 0
}
},
@@ -437,24 +437,25 @@
"tag": "button",
"role": "",
"cls": "active",
"label": "列表",
"label": "网格",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"self": true,
"mutations": 15,
"api": 0
}
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"账户"
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"时间"
]
}
@@ -1,13 +1,14 @@
# 功能审计 · asset-factory
路由:`/asset-factory` · 模式:isolated
合计 24 · ✅ works 22 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 2 · ⚪ disabled 0
路由:`/asset-factory` · 模式:quick
合计 24 · ✅ works 23 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 时间
@@ -2,14 +2,14 @@
"name": "dashboard",
"route": "/dashboard",
"url": "http://127.0.0.1:5173/dashboard",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 25,
"works": 25,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"skipped": 5,
"noop": 0,
"blocked": 0
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 30,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 29,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 41,
"mutations": 42,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 27,
"api": 0
"api": 1
}
},
{
@@ -208,7 +208,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 54,
"api": 2
}
},
@@ -226,8 +226,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
"mutations": 28,
"api": 1
}
},
{
@@ -244,7 +244,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 25,
"mutations": 30,
"api": 0
}
},
@@ -271,7 +271,7 @@
"tag": "button",
"role": "",
"cls": "stat",
"label": "余额 ¥¥11116.00已冻结 ¥5.00",
"label": "余额 ¥¥14908.00已冻结 ¥0.00",
"href": "",
"disabled": false,
"active": false,
@@ -281,7 +281,7 @@
"overlay": false,
"self": false,
"mutations": 27,
"api": 0
"api": 1
}
},
{
@@ -311,14 +311,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 5,
"api": 1
}
"verdict": "skipped-destructive"
},
{
"idx": 17,
@@ -329,50 +322,29 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 5,
"api": 1
}
"verdict": "skipped-destructive"
},
{
"idx": 18,
"tag": "button",
"role": "",
"cls": "recent-row",
"label": "9:16桥接测试项目 20260529透真玻尿酸补水面膜 / AI 全生 / 4 镜脚本继续",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 5,
"api": 1
}
},
{
"idx": 19,
"tag": "button",
"role": "",
"cls": "recent-row",
"label": "9:16南卡 · 痛点种草 · v1南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 5,
"api": 1
}
"verdict": "skipped-destructive"
},
{
"idx": 19,
"tag": "button",
"role": "",
"cls": "recent-row",
"label": "9:16桥接测试项目 20260529透真玻尿酸补水面膜 / AI 全生 / 4 镜脚本继续",
"href": "",
"disabled": false,
"active": false,
"verdict": "skipped-destructive"
},
{
"idx": 20,
@@ -383,14 +355,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 5,
"api": 1
}
"verdict": "skipped-destructive"
},
{
"idx": 21,
@@ -406,7 +371,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 25,
"mutations": 30,
"api": 0
}
},
@@ -415,7 +380,7 @@
"tag": "a",
"role": "",
"cls": "shortcut",
"label": "资产库67 资产",
"label": "资产库101 资产",
"href": "",
"disabled": false,
"active": false,
@@ -424,7 +389,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 41,
"mutations": 42,
"api": 0
}
},
@@ -433,7 +398,7 @@
"tag": "a",
"role": "",
"cls": "shortcut",
"label": "充值¥11116.00",
"label": "充值¥14908.00",
"href": "",
"disabled": false,
"active": false,
@@ -443,7 +408,7 @@
"overlay": false,
"self": false,
"mutations": 27,
"api": 0
"api": 1
}
},
{
@@ -467,24 +432,22 @@
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,908.00",
"账户",
"总项目 ALL 8 本月 +3",
"进行中 WIP 3 2 个待审核",
"本月成片 DONE 3 较上月 +33%",
"余额 ¥ ¥327.40 已用 ¥162.60 / ¥500",
"[ ALL · 8 ]",
"9:16 补水面膜 · 痛点种草 · v3 透真补水面膜 / AI 全生 / 7 镜 故事板 待",
"9:16 透真防晒 · 通勤对比 透真防晒 / AI 全生 / 6 镜 已完成 打开",
"9:16 蓝牙耳机 · 开箱测评 Pro 4 蓝牙耳机 / 自带脚本 / 6 镜 视频生成 4/",
"9:16 春日新品 · 立体口红 凝彩立体口红 / 一句话 / 5 镜 资产生成中 继续",
"9:16 咖啡冻干 · 早八 冷萃咖啡冻干 / 一句话 / 5 镜 故事板失败 查看",
"资产库人 8 · 景 14 · 片 8",
"故事板 待确认",
"总项目 ALL 6 本月完成 2",
"进行中 WIP 4 全部正常推进",
"本月成片 DONE 2 累计完成 2",
"余额 ¥ ¥14,908.00 已用 ¥113.00 / ¥15,021.00",
"[ ALL · 6 ]",
"9:16真应用验证项目 · 补水面膜种草透真玻尿酸补水面膜 / AI 全生 / 4 镜基础资产生",
"9:16端到端播放器验证南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜已完成打开",
"9:16桥接测试项目 20260529透真玻尿酸补水面膜 / AI 全生 / 4 镜脚本待生成继",
"资产库资产 20 个",
"充值¥14,908.00",
"基础资产生成中",
"已完成",
"视频生成 4/6",
"资产生成中",
"故事板失败"
"脚本待生成",
"故事板生成中"
]
}
@@ -1,29 +1,34 @@
# 功能审计 · dashboard
路由:`/dashboard` · 模式:isolated
合计 25 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
路由:`/dashboard` · 模式:quick
合计 25 · ✅ works 20 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)5 · ◷ noop-active 0 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,908.00
- 账户
- 总项目 ALL 8 本月 +3
- 进行中 WIP 3 2 个待审核
- 本月成片 DONE 3 较上月 +33%
- 余额 ¥ ¥327.40 已用 ¥162.60 / ¥500
- [ ALL · 8 ]
- 9:16 补水面膜 · 痛点种草 · v3 透真补水面膜 / AI 全生 / 7 镜 故事板 待
- 9:16 透真防晒 · 通勤对比 透真防晒 / AI 全生 / 6 镜 已完成 打开
- 9:16 蓝牙耳机 · 开箱测评 Pro 4 蓝牙耳机 / 自带脚本 / 6 镜 视频生成 4/
- 9:16 春日新品 · 立体口红 凝彩立体口红 / 一句话 / 5 镜 资产生成中 继续
- 9:16 咖啡冻干 · 早八 冷萃咖啡冻干 / 一句话 / 5 镜 故事板失败 查看
- 资产库人 8 · 景 14 · 片 8
- 故事板 待确认
- 总项目 ALL 6 本月完成 2
- 进行中 WIP 4 全部正常推进
- 本月成片 DONE 2 累计完成 2
- 余额 ¥ ¥14,908.00 已用 ¥113.00 / ¥15,021.00
- [ ALL · 6 ]
- 9:16真应用验证项目 · 补水面膜种草透真玻尿酸补水面膜 / AI 全生 / 4 镜基础资产生
- 9:16端到端播放器验证南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜已完成打开
- 9:16桥接测试项目 20260529透真玻尿酸补水面膜 / AI 全生 / 4 镜脚本待生成继
- 资产库资产 20 个
- 充值¥14,908.00
- 基础资产生成中
- 已完成
- 视频生成 4/6
- 资产生成中
- 故事板失败
- 脚本待生成
- 故事板生成中
## ⏭ 破坏性按钮(未自动点,需人工验)
- 9:16真应用验证项目 · 补水面膜种草透真玻尿酸补水面膜 / AI 全生 / 4 镜基础资产继 `button`
- 9:16端到端播放器验证南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜拼接导出继续 `button`
- 9:16南卡 · 痛点种草 · v1南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜 `button`
- 9:16桥接测试项目 20260529透真玻尿酸补水面膜 / AI 全生 / 4 镜脚本继续 `button`
- 9:16南卡 · 痛点种草 · v1南卡 Lite Pro 蓝牙耳机 / AI 全生 / 4 镜 `button`
@@ -2,15 +2,15 @@
"name": "image-optimize",
"route": "/image-optimize",
"url": "http://127.0.0.1:5173/image-optimize",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 24,
"works": 24,
"dead": 0,
"works": 21,
"dead": 2,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 0,
"noop": 1,
"blocked": 0
},
"results": [
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "展开导航",
"label": "收窄导航",
"href": "",
"disabled": false,
"active": false,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -396,17 +396,17 @@
"idx": 21,
"tag": "button",
"role": "",
"cls": "ic-param-btn",
"label": "风格默认",
"cls": "mi.selected",
"label": "1:1",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"active": true,
"verdict": "noop-active",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 1,
"mutations": 0,
"api": 0
}
},
@@ -414,17 +414,17 @@
"idx": 22,
"tag": "button",
"role": "",
"cls": "ic-param-btn",
"label": "张数4",
"cls": "mi.",
"label": "3:4",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"verdict": "dead",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 1,
"mutations": 0,
"api": 0
}
},
@@ -432,25 +432,25 @@
"idx": 23,
"tag": "button",
"role": "",
"cls": "send-btn",
"label": "生成",
"cls": "mi.",
"label": "4:5",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"verdict": "dead",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 21,
"api": 1
"mutations": 0,
"api": 0
}
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"折叠侧栏",
"时间",
@@ -1,14 +1,20 @@
# 功能审计 · image-optimize
路由:`/image-optimize` · 模式:isolated
合计 24 · ✅ works 24 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
路由:`/image-optimize` · 模式:quick
合计 24 · ✅ works 21 · ❌ **dead 2** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
## ❌ 点了没反应(DEAD —— 重点修)
| # | 文字 | 标签 | 类名 |
|---|---|---|---|
| 22 | 3:4 | `button` | `mi.` |
| 23 | 4:5 | `button` | `mi.` |
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 折叠侧栏
- 时间
+113 -248
View File
@@ -2,14 +2,14 @@
"name": "library",
"route": "/library",
"url": "http://127.0.0.1:5173/library",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 38,
"works": 35,
"works": 23,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 2,
"disabled": 1,
"skipped": 13,
"noop": 1,
"blocked": 0
},
@@ -82,7 +82,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 26,
"api": 0
}
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 19,
"mutations": 20,
"api": 0
}
},
@@ -289,7 +289,7 @@
"tag": "div",
"role": "",
"cls": "tab.active",
"label": "人物 14",
"label": "人物 15",
"href": "",
"disabled": false,
"active": true,
@@ -307,7 +307,7 @@
"tag": "div",
"role": "",
"cls": "tab",
"label": "场景 11",
"label": "场景 22",
"href": "",
"disabled": false,
"active": false,
@@ -316,7 +316,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 48,
"mutations": 81,
"api": 0
}
},
@@ -325,7 +325,7 @@
"tag": "div",
"role": "",
"cls": "tab",
"label": "商品图 35",
"label": "商品图 39",
"href": "",
"disabled": false,
"active": false,
@@ -334,7 +334,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 97,
"mutations": 121,
"api": 0
}
},
@@ -343,7 +343,7 @@
"tag": "div",
"role": "",
"cls": "tab",
"label": "成片 10",
"label": "成片 23",
"href": "",
"disabled": false,
"active": false,
@@ -352,7 +352,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 38,
"mutations": 84,
"api": 0
}
},
@@ -361,7 +361,7 @@
"tag": "div",
"role": "",
"cls": "tab",
"label": "我的上传 1",
"label": "我的上传 3",
"href": "",
"disabled": false,
"active": false,
@@ -370,7 +370,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 30,
"mutations": 51,
"api": 0
}
},
@@ -388,7 +388,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 29,
"mutations": 26,
"api": 0
}
},
@@ -397,78 +397,6 @@
"tag": "button",
"role": "",
"cls": "chip",
"label": "性别",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
},
{
"idx": 22,
"tag": "button",
"role": "",
"cls": "chip",
"label": "年龄段",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "chip",
"label": "角色标签",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "chip",
"label": "来源",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
},
{
"idx": 25,
"tag": "button",
"role": "",
"cls": "chip",
"label": "最近添加",
"href": "",
"disabled": false,
@@ -478,189 +406,122 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"mutations": 8,
"api": 0
}
},
{
"idx": 22,
"tag": "div",
"role": "button",
"cls": "mi.selected",
"label": "最近添加",
"href": "",
"disabled": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 8,
"api": 0
}
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost",
"label": "取消",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 10,
"api": 0
}
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "btn.btn-primary",
"label": "上传资产",
"href": "",
"disabled": true,
"active": false,
"verdict": "disabled"
},
{
"idx": 25,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 26,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 27,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 28,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 29,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 30,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 31,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 32,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 33,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 34,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 35,
"tag": "div",
"role": "button",
"cls": "placeholder.asset-thumb",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 4,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 36,
@@ -677,10 +538,14 @@
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"最近使用",
"缺三视图,查看说明"
"管理资产",
"性别",
"年龄段",
"角色标签",
"来源",
"最近使用"
]
}
@@ -1,15 +1,19 @@
# 功能审计 · library
路由:`/library` · 模式:isolated
合计 38 · ✅ works 35 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)2 · ◷ noop-active 1 · ⚪ disabled 0
路由:`/library` · 模式:quick
合计 38 · ✅ works 23 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)13 · ◷ noop-active 1 · ⚪ disabled 1
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 管理资产
- 性别
- 年龄段
- 角色标签
- 来源
- 最近使用
- 缺三视图,查看说明
+55 -105
View File
@@ -2,14 +2,14 @@
"name": "messages",
"route": "/messages",
"url": "http://127.0.0.1:5173/messages",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 26,
"works": 25,
"total": 28,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"skipped": 7,
"noop": 1,
"blocked": 0
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 19,
"mutations": 24,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 19,
"mutations": 23,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 35,
"mutations": 36,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 21,
"api": 0
"api": 1
}
},
{
@@ -289,7 +289,7 @@
"tag": "button",
"role": "",
"cls": "msg-filter.active",
"label": "全部20",
"label": "全部111",
"href": "",
"disabled": false,
"active": true,
@@ -316,8 +316,8 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 26,
"api": 0
"mutations": 28,
"api": 1
}
},
{
@@ -325,7 +325,7 @@
"tag": "button",
"role": "",
"cls": "msg-filter.",
"label": "任务20",
"label": "任务110",
"href": "",
"disabled": false,
"active": false,
@@ -334,8 +334,8 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 4,
"api": 0
"mutations": 6,
"api": 1
}
},
{
@@ -352,8 +352,8 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 26,
"api": 0
"mutations": 6,
"api": 1
}
},
{
@@ -370,8 +370,8 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 26,
"api": 0
"mutations": 6,
"api": 1
}
},
{
@@ -379,7 +379,7 @@
"tag": "button",
"role": "",
"cls": "msg-filter.",
"label": "系统0",
"label": "系统1",
"href": "",
"disabled": false,
"active": false,
@@ -388,112 +388,62 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 26,
"api": 0
"mutations": 6,
"api": 1
}
},
{
"idx": 21,
"tag": "button",
"role": "",
"cls": "msg-item.active.read",
"label": "资产「AI 生成 · image · 4」已加入资产库7mProduct Image · Ima",
"href": "",
"disabled": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 2,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 22,
"tag": "button",
"role": "",
"cls": "msg-item.read",
"label": "资产「AI 生成 · image · 3」已加入资产库8mProduct Image · Ima",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 5,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "msg-item.read",
"label": "资产「AI 生成 · image · 2」已加入资产库8mProduct Image · Ima",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 5,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "msg-item.read",
"label": "资产「AI 生成 · image · 1」已加入资产库9mProduct Image · Ima",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 7,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 25,
"tag": "button",
"role": "",
"cls": "msg-item.read",
"label": "资产「AI 生成 · cover · 4」已加入资产库21mProduct Image · Im",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 7,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 26,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 27,
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"补水面膜 · 痛点种草 v3 成片已完成 12m 7 镜 · 40 秒 · ¥18.40 已结算",
"脚本生成失败 · 618 大促 1h Prompt 超过服务限制,本次失败未扣费,可一键重试。 ",
"4 张模特上身图已加入资产库 2h 祛痘精华 · 通勤白领 · 3:4,可直接进入视频项目。 已",
"@刘 正在编辑「补水面膜」项目 3h 你暂时以只读方式查看该项目,避免两人同时改动覆盖。 更新 ",
"@王芳 已加入团队 5h 角色为运营,月限额 ¥800,可读写团队资产。 更新 团队",
"团队余额低于预警线 7h 当前余额 ¥87.20,按近 7 天速度预计可支撑 4 个视频项目。 ",
"补水面膜 →"
"资产「AI 生成 · image · 1」已加入资产库11mProduct Image · Im",
"资产「南卡 · 痛点种草 · v1-final.mp4」已加入资产库26mFinal Video",
"资产「南卡 · 痛点种草 · v1-final.mp4」已加入资产库1hFinal Video ",
"资产「南卡 · 痛点种草 · v1-BGM」已加入资产库1hUpload · Audio已完成系",
"系统 →"
]
}
@@ -1,20 +1,18 @@
# 功能审计 · messages
路由:`/messages` · 模式:isolated
合计 26 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
路由:`/messages` · 模式:quick
合计 28 · ✅ works 20 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)7 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 补水面膜 · 痛点种草 v3 成片已完成 12m 7 镜 · 40 秒 · ¥18.40 已结算
- 脚本生成失败 · 618 大促 1h Prompt 超过服务限制,本次失败未扣费,可一键重试。
- 4 张模特上身图已加入资产库 2h 祛痘精华 · 通勤白领 · 3:4,可直接进入视频项目。 已
- @刘 正在编辑「补水面膜」项目 3h 你暂时以只读方式查看该项目,避免两人同时改动覆盖。 更新
- @王芳 已加入团队 5h 角色为运营,月限额 ¥800,可读写团队资产。 更新 团队
- 团队余额低于预警线 7h 当前余额 ¥87.20,按近 7 天速度预计可支撑 4 个视频项目。
- 补水面膜 →
- 资产「AI 生成 · image · 1」已加入资产库11mProduct Image · Im
- 资产「南卡 · 痛点种草 · v1-final.mp4」已加入资产库26mFinal Video
- 资产「南卡 · 痛点种草 · v1-final.mp4」已加入资产库1hFinal Video
- 资产「南卡 · 痛点种草 · v1-BGM」已加入资产库1hUpload · Audio已完成系
- 系统 →
@@ -2,15 +2,15 @@
"name": "model-photo-demo-a",
"route": "/model-photo/demo-a",
"url": "http://127.0.0.1:5173/model-photo/demo-a",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 37,
"total": 38,
"works": 33,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 1,
"noop": 3,
"skipped": 4,
"noop": 1,
"blocked": 0
},
"results": [
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "展开导航",
"label": "收窄导航",
"href": "",
"disabled": false,
"active": false,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -388,7 +388,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -454,17 +454,17 @@
"idx": 24,
"tag": "button",
"role": "",
"cls": "dm-chip.active",
"cls": "dm-chip.",
"label": "4 张",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"self": true,
"mutations": 5,
"api": 0
}
},
@@ -508,17 +508,17 @@
"idx": 27,
"tag": "button",
"role": "",
"cls": "dm-chip.active",
"cls": "dm-chip.",
"label": "3:4",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"self": true,
"mutations": 5,
"api": 0
}
},
@@ -578,18 +578,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
},
"consoleNote": [
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — ",
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — "
]
"verdict": "skipped-destructive"
},
{
"idx": 32,
@@ -644,18 +633,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
},
"consoleNote": [
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — ",
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — "
]
"verdict": "skipped-destructive"
},
{
"idx": 35,
@@ -700,12 +678,18 @@
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — ",
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — "
]
},
{
"idx": 37,
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"立即生成 · 透真补水面膜 × Ava"
]
@@ -1,17 +1,19 @@
# 功能审计 · model-photo-demo-a
路由:`/model-photo/demo-a` · 模式:isolated
合计 37 · ✅ works 33 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)1 · ◷ noop-active 3 · ⚪ disabled 0
路由:`/model-photo/demo-a` · 模式:quick
合计 38 · ✅ works 33 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)4 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 立即生成 · 透真补水面膜 × Ava
## ⏭ 破坏性按钮(未自动点,需人工验)
- 立即生成 · 南卡 Lite Pro 蓝牙耳机 × Ava `button`
- 全部重跑 `button`
- 全部重跑 `button`
@@ -2,14 +2,14 @@
"name": "model-photo-demo-b",
"route": "/model-photo/demo-b",
"url": "http://127.0.0.1:5173/model-photo/demo-b",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 37,
"works": 36,
"works": 34,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"skipped": 2,
"noop": 1,
"blocked": 0
},
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "收窄导航",
"label": "展开导航",
"href": "",
"disabled": false,
"active": false,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -208,7 +208,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 49,
"api": 2
}
},
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 36,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 20,
"mutations": 26,
"api": 0
}
},
@@ -370,7 +370,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 8,
"mutations": 7,
"api": 0
}
},
@@ -388,7 +388,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -511,18 +511,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
},
"consoleNote": [
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — ",
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — "
]
"verdict": "skipped-destructive"
},
{
"idx": 27,
@@ -577,18 +566,7 @@
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
},
"consoleNote": [
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — ",
"Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — "
]
"verdict": "skipped-destructive"
},
{
"idx": 30,
@@ -747,8 +725,8 @@
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"生成 · 透真补水面膜 × Ava"
]
@@ -1,14 +1,18 @@
# 功能审计 · model-photo-demo-b
路由:`/model-photo/demo-b` · 模式:isolated
合计 37 · ✅ works 36 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
路由:`/model-photo/demo-b` · 模式:quick
合计 37 · ✅ works 34 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)2 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 生成 · 透真补水面膜 × Ava
## ⏭ 破坏性按钮(未自动点,需人工验)
- 全部重跑 `button`
- 全部重跑 `button`
@@ -2,7 +2,7 @@
"name": "model-photo",
"route": "/model-photo",
"url": "http://127.0.0.1:5173/model-photo",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 32,
"works": 31,
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "收窄导航",
"label": "展开导航",
"href": "",
"disabled": false,
"active": false,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -280,7 +280,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -492,7 +492,7 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -502,19 +502,19 @@
},
{
"idx": 25,
"tag": "button",
"role": "",
"cls": "tb-chip",
"label": "模特",
"tag": "div",
"role": "button",
"cls": "mi.selected",
"label": "最近添加",
"href": "",
"disabled": false,
"active": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -527,7 +527,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 4// 真人模特",
"label": "南卡 · 痛点种草 · v1-person// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -536,7 +536,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 22,
"api": 0
},
"consoleNote": [
@@ -549,7 +549,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 3// 真人模特",
"label": "AI 生成 · model · 1// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -558,7 +558,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -571,7 +571,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 2// 真人模特",
"label": "AI 生成 · model · 1// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -580,7 +580,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -593,7 +593,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 1// 真人模特",
"label": "AI 生成 · model · 2// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -602,7 +602,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -615,7 +615,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 4// 真人模特",
"label": "AI 生成 · model · 2// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -624,7 +624,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -637,7 +637,7 @@
"tag": "button",
"role": "",
"cls": "model-card.",
"label": "AI 生成 · model · 3// 真人模特",
"label": "AI 生成 · model · 2// 真人模特",
"href": "",
"disabled": false,
"active": false,
@@ -646,7 +646,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
},
"consoleNote": [
@@ -657,11 +657,12 @@
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"折叠侧栏",
"全部商品 7 个",
"时间",
"立即生成 (预估 ¥0.00)"
]
}
@@ -1,16 +1,17 @@
# 功能审计 · model-photo
路由:`/model-photo` · 模式:isolated
路由:`/model-photo` · 模式:quick
合计 32 · ✅ works 31 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 折叠侧栏
- 全部商品 7 个
- 时间
- 立即生成 (预估 ¥0.00)
+168 -110
View File
@@ -2,13 +2,13 @@
"name": "pipeline",
"route": "/pipeline/1048451e-3b4a-4b66-a8f4-cb865096de2f",
"url": "http://127.0.0.1:5173/pipeline/1048451e-3b4a-4b66-a8f4-cb865096de2f",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 29,
"works": 27,
"total": 34,
"works": 26,
"dead": 0,
"error": 0,
"disabled": 2,
"disabled": 8,
"skipped": 0,
"noop": 0,
"blocked": 0
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 31,
"mutations": 36,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 22,
"mutations": 26,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": false,
"mutations": 25,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 22,
"api": 0
"mutations": 24,
"api": 1
}
},
{
@@ -270,17 +270,17 @@
"idx": 14,
"tag": "a",
"role": "",
"cls": "sp-dot.active",
"cls": "sp-dot",
"label": "基础资产",
"href": "#stage-2",
"disabled": false,
"active": true,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 20,
"self": true,
"mutations": 22,
"api": 0
}
},
@@ -316,7 +316,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 23,
"api": 0
}
},
@@ -334,7 +334,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 27,
"mutations": 23,
"api": 1
}
},
@@ -342,62 +342,41 @@
"idx": 18,
"tag": "button",
"role": "",
"cls": "tag-add",
"label": "添加人物",
"cls": "ctl-btn",
"label": "上一帧 (←)",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
}
"verdict": "disabled"
},
{
"idx": 19,
"tag": "button",
"role": "",
"cls": "tag-add",
"label": "添加场景",
"cls": "ctl-btn",
"label": "播放 / 暂停 (空格)",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 24,
"api": 0
}
"verdict": "disabled"
},
{
"idx": 20,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost.btn-sm",
"label": "↻ 整体重写",
"cls": "ctl-btn",
"label": "下一帧 (→)",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 22,
"api": 1
}
"verdict": "disabled"
},
{
"idx": 21,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost.btn-sm",
"label": "清空对话",
"cls": "ctl-btn",
"label": "静音",
"href": "",
"disabled": true,
"active": false,
@@ -405,10 +384,28 @@
},
{
"idx": 22,
"tag": "button",
"role": "",
"cls": "chat-mode.primary",
"label": "AI 全生",
"tag": "div",
"role": "button",
"cls": "active",
"label": "字幕",
"href": "",
"disabled": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 61,
"api": 0
}
},
{
"idx": 23,
"tag": "div",
"role": "button",
"cls": "",
"label": "转场",
"href": "",
"disabled": false,
"active": false,
@@ -417,34 +414,16 @@
"url": false,
"overlay": false,
"self": false,
"mutations": 22,
"api": 1
}
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "chat-mode",
"label": "一句话主题",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 21,
"mutations": 33,
"api": 0
}
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "chat-mode",
"label": "自带脚本",
"tag": "div",
"role": "button",
"cls": "",
"label": "BGM",
"href": "",
"disabled": false,
"active": false,
@@ -453,7 +432,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 21,
"mutations": 35,
"api": 0
}
},
@@ -461,8 +440,8 @@
"idx": 25,
"tag": "button",
"role": "",
"cls": "chat-icon-btn",
"label": "上传脚本附件",
"cls": "btn.btn-sm.btn-primary",
"label": "已开启",
"href": "",
"disabled": false,
"active": false,
@@ -471,63 +450,142 @@
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"mutations": 30,
"api": 0
}
},
{
"idx": 26,
"tag": "div",
"role": "button",
"cls": "swatch-card.selected",
"label": "真实分享朴素白底",
"href": "",
"disabled": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 35,
"api": 0
}
},
{
"idx": 27,
"tag": "div",
"role": "button",
"cls": "swatch-card",
"label": "真实分享影视黑底",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 28,
"tag": "div",
"role": "button",
"cls": "swatch-card",
"label": "真实分享手写描边",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 35,
"api": 0
}
},
{
"idx": 29,
"tag": "div",
"role": "button",
"cls": "swatch-card",
"label": "真实分享综艺暖黄",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 36,
"api": 0
}
},
{
"idx": 30,
"tag": "button",
"role": "",
"cls": "chat-send-btn",
"label": "发送",
"cls": "tl-action",
"label": "撤销",
"href": "",
"disabled": true,
"active": false,
"verdict": "disabled"
},
{
"idx": 27,
"idx": 31,
"tag": "button",
"role": "",
"cls": "btn",
"label": "重新生成全部",
"cls": "tl-action",
"label": "重做",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 22,
"api": 1
}
"verdict": "disabled"
},
{
"idx": 28,
"idx": 32,
"tag": "button",
"role": "",
"cls": "btn.btn-primary.btn-lg",
"label": "进入下一步",
"cls": "tl-action",
"label": "在播放头处分割所在片段",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 20,
"api": 0
}
"verdict": "disabled"
},
{
"idx": 33,
"tag": "button",
"role": "",
"cls": "tl-action",
"label": "复制选中片段",
"href": "",
"disabled": true,
"active": false,
"verdict": "disabled"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"添加人物",
"添加场景",
"↻ 整体重写",
"清空对话",
"AI 全生",
"一句话主题",
"自带脚本",
"上传脚本附件",
"发送",
"重新生成全部",
"确认脚本,进入下一步"
]
}
@@ -1,14 +1,24 @@
# 功能审计 · pipeline
路由:`/pipeline/1048451e-3b4a-4b66-a8f4-cb865096de2f` · 模式:isolated
合计 29 · ✅ works 27 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 2
路由:`/pipeline/1048451e-3b4a-4b66-a8f4-cb865096de2f` · 模式:quick
合计 34 · ✅ works 26 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 8
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 添加人物
- 添加场景
- ↻ 整体重写
- 清空对话
- AI 全生
- 一句话主题
- 自带脚本
- 上传脚本附件
- 发送
- 重新生成全部
- 确认脚本,进入下一步
@@ -2,7 +2,7 @@
"name": "platform-cover",
"route": "/platform-cover",
"url": "http://127.0.0.1:5173/platform-cover",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 38,
"works": 35,
@@ -37,7 +37,7 @@
"tag": "button",
"role": "",
"cls": "sidebar-toggle",
"label": "展开导航",
"label": "收窄导航",
"href": "",
"disabled": false,
"active": false,
@@ -64,7 +64,7 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 14,
"mutations": 15,
"api": 0
}
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -262,7 +262,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 22,
"api": 0
}
},
@@ -280,7 +280,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 20,
"mutations": 26,
"api": 0
}
},
@@ -460,7 +460,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -478,7 +478,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -496,7 +496,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -514,7 +514,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -532,7 +532,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -550,7 +550,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -568,7 +568,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -586,7 +586,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -604,7 +604,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -622,7 +622,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 3,
"mutations": 5,
"api": 0
}
},
@@ -658,7 +658,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 5,
"mutations": 7,
"api": 0
}
},
@@ -676,7 +676,7 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 5,
"mutations": 7,
"api": 0
}
},
@@ -685,7 +685,7 @@
"tag": "button",
"role": "",
"cls": "btn.btn-primary",
"label": "立即生成 (预估 ¥2.00)",
"label": "立即生成 (预估 ¥6.00)",
"href": "",
"disabled": false,
"active": false,
@@ -693,8 +693,8 @@
}
],
"missing": [
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"折叠侧栏",
"全部商品 7 个",
@@ -1,13 +1,13 @@
# 功能审计 · platform-cover
路由:`/platform-cover` · 模式:isolated
路由:`/platform-cover` · 模式:quick
合计 38 · ✅ works 35 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)1 · ◷ noop-active 2 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 折叠侧栏
- 全部商品 7 个
@@ -16,5 +16,5 @@
- 平台
## ⏭ 破坏性按钮(未自动点,需人工验)
- 立即生成 (预估 ¥2.00) `button`
- 立即生成 (预估 ¥6.00) `button`
@@ -2,14 +2,14 @@
"name": "product-create",
"route": "/products/new",
"url": "http://127.0.0.1:5173/products/new",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 31,
"works": 31,
"works": 25,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"disabled": 1,
"skipped": 5,
"noop": 0,
"blocked": 0
},
@@ -28,7 +28,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 26,
"mutations": 28,
"api": 0
}
},
@@ -82,7 +82,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 25,
"mutations": 28,
"api": 0
}
},
@@ -118,7 +118,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 20,
"mutations": 22,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 20,
"mutations": 26,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 36,
"mutations": 39,
"api": 0
}
},
@@ -172,7 +172,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 20,
"mutations": 22,
"api": 0
}
},
@@ -190,8 +190,8 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 22,
"api": 0
"mutations": 24,
"api": 1
}
},
{
@@ -208,7 +208,7 @@
"url": true,
"overlay": true,
"self": true,
"mutations": 49,
"mutations": 51,
"api": 2
}
},
@@ -226,7 +226,7 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 25,
"mutations": 27,
"api": 0
}
},
@@ -244,8 +244,8 @@
"url": true,
"overlay": true,
"self": false,
"mutations": 19,
"api": 0
"mutations": 25,
"api": 1
}
},
{
@@ -304,13 +304,13 @@
},
{
"idx": 16,
"tag": "button",
"role": "",
"cls": "chip",
"label": "创建时间",
"tag": "div",
"role": "button",
"cls": "mi.selected",
"label": "全部分类",
"href": "",
"disabled": false,
"active": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
@@ -331,159 +331,80 @@
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 31,
"url": false,
"overlay": false,
"self": true,
"mutations": 23,
"api": 0
}
},
{
"idx": 18,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "露露同款裸感瑜伽裤 · 1200×800露露同款裸感瑜伽裤运动户外2026-06-08 创建素材",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 19,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "透真清透物理防晒霜 · 1200×800透真清透物理防晒霜美妆个护2026-06-08 创建素材",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 20,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "滋啦速食牛肉面 · 6 桶装 · 1200×800滋啦速食牛肉面 · 6 桶装食品饮料2026-",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 21,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "透真玻尿酸补水面膜 · 1200×800透真玻尿酸补水面膜美妆个护2026-05-29 创建素材",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 31,
"api": 0
}
},
{
"idx": 22,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "桥接测试补水面膜 20260529 · 1200×800桥接测试补水面膜 20260529美妆个",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 23,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "三顿半同款冻干咖啡粉 · 1200×800三顿半同款冻干咖啡粉食品饮料2026-06-08 创建",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 24,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "小熊 4L 可视空气炸锅 · 1200×800小熊 4L 可视空气炸锅家居家电2026-06-0",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": true,
"self": false,
"mutations": 30,
"api": 0
}
},
{
"idx": 25,
"tag": "button",
"role": "",
"cls": "x",
"label": "关闭",
"cls": "clear-sel",
"label": "清空",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 14,
"overlay": false,
"self": true,
"mutations": 16,
"api": 0
}
},
{
"idx": 26,
"idx": 19,
"tag": "button",
"role": "",
"cls": "danger",
"label": "删除选中",
"href": "",
"disabled": true,
"active": false,
"verdict": "disabled"
},
{
"idx": 20,
"tag": "button",
"role": "",
"cls": "",
"label": "退出",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 18,
"api": 0
}
},
{
"idx": 21,
"tag": "button",
"role": "",
"cls": "",
"label": "退出",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 18,
"api": 0
}
},
{
"idx": 22,
"tag": "select",
"role": "",
"cls": "select",
@@ -501,7 +422,7 @@
}
},
{
"idx": 27,
"idx": 23,
"tag": "div",
"role": "button",
"cls": "pf-upload-zone",
@@ -519,7 +440,7 @@
}
},
{
"idx": 28,
"idx": 24,
"tag": "button",
"role": "",
"cls": "btn-guide",
@@ -537,7 +458,7 @@
}
},
{
"idx": 29,
"idx": 25,
"tag": "button",
"role": "",
"cls": "btn",
@@ -554,36 +475,48 @@
"api": 0
}
},
{
"idx": 26,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 27,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 28,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 29,
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 30,
"tag": "button",
"role": "",
"cls": "btn.btn-primary",
"label": "创建商品",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 14,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创建 素材 4",
"空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-05-03 创建 ",
"咖啡冻干粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05 创建 素",
"防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创建 素材 7",
"速食牛肉面 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 2026-05-10 ",
"蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码 3C 2026-05-1",
"补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创建 素材 "
"管理商品",
"商品分类",
"关闭",
"美妆个护",
"使用指南",
"取消",
"创建商品"
]
}
@@ -1,20 +1,20 @@
# 功能审计 · product-create
路由:`/products/new` · 模式:isolated
合计 31 · ✅ works 31 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
路由:`/products/new` · 模式:quick
合计 31 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)5 · ◷ noop-active 0 · ⚪ disabled 1
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创建 素材 4
- 空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-05-03 创建
- 咖啡冻干粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05 创建 素
- 防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创建 素材 7
- 速食牛肉面 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 2026-05-10
- 蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码 3C 2026-05-1
- 补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创建 素材
- 管理商品
- 商品分类
- 关闭
- 美妆个护
- 使用指南
- 取消
- 创建商品
@@ -2,14 +2,14 @@
"name": "product-detail",
"route": "/products/045ad8d6-8b15-486b-a4a9-f6968eb1555f",
"url": "http://127.0.0.1:5173/products/045ad8d6-8b15-486b-a4a9-f6968eb1555f",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 29,
"works": 28,
"works": 22,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"skipped": 6,
"noop": 1,
"blocked": 0
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 18,
"mutations": 23,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -270,17 +270,17 @@
"idx": 14,
"tag": "button",
"role": "",
"cls": "ov-edit.ov-edit-single",
"label": "编辑商品信息",
"cls": "ov-tri-close",
"label": "关闭",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"overlay": true,
"self": false,
"mutations": 10,
"mutations": 12,
"api": 0
}
},
@@ -298,8 +298,8 @@
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
"mutations": 28,
"api": 1
}
},
{
@@ -419,14 +419,14 @@
"tag": "button",
"role": "",
"cls": "filter",
"label": "全部类型",
"label": "最新更新",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"overlay": false,
"self": false,
"mutations": 10,
"api": 0
@@ -434,120 +434,50 @@
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "filter",
"label": "最新生成",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 10,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 24,
"tag": "div",
"role": "button",
"cls": "thumb.placeholder",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 25,
"tag": "div",
"role": "button",
"cls": "thumb.placeholder",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 26,
"tag": "div",
"role": "button",
"cls": "thumb.placeholder",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 27,
"tag": "div",
"role": "button",
"cls": "thumb.placeholder",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 28,
"tag": "div",
"role": "button",
"cls": "thumb.placeholder",
"label": "点击放大",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 11,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,908.00",
"账户",
"全部类型",
"通过",
"网格视图",
"列表视图"
"列表视图",
"最新生成"
]
}
@@ -1,16 +1,18 @@
# 功能审计 · product-detail
路由:`/products/045ad8d6-8b15-486b-a4a9-f6968eb1555f` · 模式:isolated
合计 29 · ✅ works 28 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
路由:`/products/045ad8d6-8b15-486b-a4a9-f6968eb1555f` · 模式:quick
合计 29 · ✅ works 22 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)6 · ◷ noop-active 1 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,908.00
- 账户
- 全部类型
- 通过
- 网格视图
- 列表视图
- 最新生成
@@ -2,13 +2,13 @@
"name": "products",
"route": "/products",
"url": "http://127.0.0.1:5173/products",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 25,
"works": 25,
"works": 24,
"dead": 0,
"error": 0,
"disabled": 0,
"disabled": 1,
"skipped": 0,
"noop": 0,
"blocked": 0
@@ -28,7 +28,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 26,
"mutations": 28,
"api": 0
}
},
@@ -82,7 +82,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 25,
"mutations": 28,
"api": 0
}
},
@@ -118,7 +118,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 22,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 26,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 39,
"api": 0
}
},
@@ -172,7 +172,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 22,
"api": 0
}
},
@@ -190,8 +190,8 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"mutations": 24,
"api": 1
}
},
{
@@ -208,7 +208,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 49,
"mutations": 51,
"api": 2
}
},
@@ -226,7 +226,7 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 25,
"mutations": 27,
"api": 0
}
},
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 25,
"api": 1
}
},
{
@@ -304,13 +304,13 @@
},
{
"idx": 16,
"tag": "button",
"role": "",
"cls": "chip",
"label": "创建时间",
"tag": "div",
"role": "button",
"cls": "mi.selected",
"label": "全部分类",
"href": "",
"disabled": false,
"active": false,
"active": true,
"verdict": "works",
"signals": {
"url": false,
@@ -331,100 +331,93 @@
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 31,
"self": true,
"mutations": 23,
"api": 0
}
},
{
"idx": 18,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "露露同款裸感瑜伽裤 · 1200×800露露同款裸感瑜伽裤运动户外2026-06-08 创建素材",
"tag": "button",
"role": "",
"cls": "clear-sel",
"label": "清空",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"self": true,
"mutations": 16,
"api": 0
}
},
{
"idx": 19,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "透真清透物理防晒霜 · 1200×800透真清透物理防晒霜美妆个护2026-06-08 创建素材",
"tag": "button",
"role": "",
"cls": "danger",
"label": "删除选中",
"href": "",
"disabled": false,
"disabled": true,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 30,
"api": 0
}
"verdict": "disabled"
},
{
"idx": 20,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "滋啦速食牛肉面 · 6 桶装 · 1200×800滋啦速食牛肉面 · 6 桶装食品饮料2026-",
"tag": "button",
"role": "",
"cls": "",
"label": "退出",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"self": true,
"mutations": 18,
"api": 0
}
},
{
"idx": 21,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "透真玻尿酸补水面膜 · 1200×800透真玻尿酸补水面膜美妆个护2026-05-29 创建素材",
"tag": "button",
"role": "",
"cls": "",
"label": "退出",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 31,
"self": true,
"mutations": 18,
"api": 0
}
},
{
"idx": 22,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "桥接测试补水面膜 20260529 · 1200×800桥接测试补水面膜 20260529美妆个",
"tag": "select",
"role": "",
"cls": "select",
"label": "美妆个护",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"mutations": 0,
"api": 0
}
},
@@ -432,50 +425,45 @@
"idx": 23,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "三顿半同款冻干咖啡粉 · 1200×800三顿半同款冻干咖啡粉食品饮料2026-06-08 创建",
"cls": "pf-upload-zone",
"label": "点击上传或拖拽图片到此处// 支持 JPG、PNG 格式,建议尺寸 800×800 以上,大小不",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"mutations": 0,
"api": 0
}
},
{
"idx": 24,
"tag": "div",
"role": "button",
"cls": "product-card",
"label": "小熊 4L 可视空气炸锅 · 1200×800小熊 4L 可视空气炸锅家居家电2026-06-0",
"tag": "button",
"role": "",
"cls": "btn-guide",
"label": "使用指南",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"url": false,
"overlay": false,
"self": false,
"mutations": 30,
"self": true,
"mutations": 13,
"api": 0
}
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,908.00",
"账户",
"瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创建 素材 4",
"空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-05-03 创建 ",
"咖啡冻干粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05 创建 素",
"防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创建 素材 7",
"速食牛肉面 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 2026-05-10 ",
"蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码 3C 2026-05-1",
"补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创建 素材 "
"管理商品",
"商品分类"
]
}
@@ -1,20 +1,15 @@
# 功能审计 · products
路由:`/products` · 模式:isolated
合计 25 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
路由:`/products` · 模式:quick
合计 25 · ✅ works 24 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 1
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,908.00
- 账户
- 瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创建 素材 4
- 空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-05-03 创建
- 咖啡冻干粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05 创建 素
- 防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创建 素材 7
- 速食牛肉面 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 2026-05-10
- 蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码 3C 2026-05-1
- 补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创建 素材
- 管理商品
- 商品分类
@@ -2,7 +2,7 @@
"name": "projects-new",
"route": "/projects/new",
"url": "http://127.0.0.1:5173/projects/new",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 15,
"works": 15,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -208,7 +208,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 49,
"mutations": 20,
"api": 2
}
},
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -287,18 +287,10 @@
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"1 选择商品 未选择",
"2 项目配置 时长 · 风格 · 人物",
"创建新商品 // 在此添加一个新商品",
"透真玻尿酸补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创",
"透真清透物理防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创",
"三顿半同款冻干咖啡粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05",
"南卡 Lite Pro 蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码 ",
"滋啦速食牛肉面 · 6 桶装 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 20",
"小熊 4L 可视空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-0",
"露露同款裸感瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创"
"2 项目配置 时长 · 风格 · 人物"
]
}
@@ -1,23 +1,15 @@
# 功能审计 · projects-new
路由:`/projects/new` · 模式:isolated
路由:`/projects/new` · 模式:quick
合计 15 · ✅ works 15 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 1 选择商品 未选择
- 2 项目配置 时长 · 风格 · 人物
- 创建新商品 // 在此添加一个新商品
- 透真玻尿酸补水面膜 · 1200×800 透真玻尿酸补水面膜 美妆个护 2026-05-15 创
- 透真清透物理防晒霜 · 1200×800 透真清透物理防晒霜 美妆个护 2026-05-08 创
- 三顿半同款冻干咖啡粉 · 1200×800 三顿半同款冻干咖啡粉 食品饮料 2026-05-05
- 南卡 Lite Pro 蓝牙耳机 · 1200×800 南卡 Lite Pro 蓝牙耳机 数码
- 滋啦速食牛肉面 · 6 桶装 · 1200×800 滋啦速食牛肉面 · 6 桶装 食品饮料 20
- 小熊 4L 可视空气炸锅 · 1200×800 小熊 4L 可视空气炸锅 家居家电 2026-0
- 露露同款裸感瑜伽裤 · 1200×800 露露同款裸感瑜伽裤 运动户外 2026-04-30 创
+53 -157
View File
@@ -2,15 +2,15 @@
"name": "projects",
"route": "/projects",
"url": "http://127.0.0.1:5173/projects",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 24,
"works": 22,
"works": 15,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 2,
"skipped": 9,
"noop": 0,
"blocked": 0
},
"results": [
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 21,
"mutations": 26,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 21,
"mutations": 25,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 37,
"mutations": 38,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 23,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 20,
"api": 0
"mutations": 24,
"api": 1
}
},
{
@@ -286,182 +286,78 @@
},
{
"idx": 15,
"tag": "div",
"role": "",
"cls": "tab.active",
"label": "全部 6",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 16,
"tag": "div",
"role": "",
"cls": "tab",
"label": "进行中 5",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 6,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 17,
"tag": "div",
"role": "",
"cls": "tab",
"label": "已完成 1",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 10,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 18,
"tag": "div",
"role": "",
"cls": "tab",
"label": "失败 0",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 12,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 19,
"tag": "button",
"role": "",
"cls": "chip",
"label": "商品品类",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 20,
"tag": "button",
"role": "",
"cls": "chip",
"label": "脚本来源",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 21,
"tag": "button",
"role": "",
"cls": "chip",
"label": "创建时间",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"self": false,
"mutations": 3,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 22,
"tag": "button",
"role": "",
"cls": "",
"label": "网格",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": true,
"mutations": 13,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "active",
"label": "列表",
"href": "",
"disabled": false,
"active": true,
"verdict": "noop-active",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"9:16 补水面膜 · 痛点种草 · v36 镜 · 0-15s 透真补水面膜 AI 全生 3/",
"9:16 速食牛肉面 · 加班治愈4 镜 · 0-12s 滋啦速食 · 6 桶装 一句话主题 2",
"删除项目",
"9:16 透真防晒 · 通勤对比6 镜 · 0-18s 透真清透防晒霜 AI 全生 4/5 视频",
"9:16 咖啡冻干 · 早八剧情5 镜 · 0-15s 三顿半同款冻干 一句话主题 3/5 故事",
"9:16 蓝牙耳机 · 开箱测评5 镜 · 0-15s 南卡 Lite Pro 自带脚本 5/5",
"9:16 瑜伽裤 · 通勤穿搭5 镜 · 0-15s 露露同款瑜伽裤 AI 全生 5/5 已完成",
"管理项目",
"新建项目",
"商品品类",
"脚本来源",
"创建时间",
"网格",
"列表",
"全部 6",
"进行中 4",
"已完成 2",
"失败 0",
"基础资产生成中",
"脚本待生成",
"故事板生成中",
"资产生成中",
"视频生成 4/6",
"故事板生成失败"
"视频片段生成中"
]
}
+18 -14
View File
@@ -1,24 +1,28 @@
# 功能审计 · projects
路由:`/projects` · 模式:isolated
合计 24 · ✅ works 22 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 2 · ⚪ disabled 0
路由:`/projects` · 模式:quick
合计 24 · ✅ works 15 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)9 · ◷ noop-active 0 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 9:16 补水面膜 · 痛点种草 · v36 镜 · 0-15s 透真补水面膜 AI 全生 3/
- 9:16 速食牛肉面 · 加班治愈4 镜 · 0-12s 滋啦速食 · 6 桶装 一句话主题 2
- 删除项目
- 9:16 透真防晒 · 通勤对比6 镜 · 0-18s 透真清透防晒霜 AI 全生 4/5 视频
- 9:16 咖啡冻干 · 早八剧情5 镜 · 0-15s 三顿半同款冻干 一句话主题 3/5 故事
- 9:16 蓝牙耳机 · 开箱测评5 镜 · 0-15s 南卡 Lite Pro 自带脚本 5/5
- 9:16 瑜伽裤 · 通勤穿搭5 镜 · 0-15s 露露同款瑜伽裤 AI 全生 5/5 已完成
- 管理项目
- 新建项目
- 商品品类
- 脚本来源
- 创建时间
- 网格
- 列表
- 全部 6
- 进行中 4
- 已完成 2
- 失败 0
- 基础资产生成中
- 脚本待生成
- 故事板生成中
- 资产生成中
- 视频生成 4/6
- 故事板生成失败
- 视频片段生成中
@@ -0,0 +1,45 @@
[function-audit] dashboard … dead 0 / 25, missing 18
[function-audit] products … dead 0 / 25, missing 6
[function-audit] product-detail … dead 0 / 29, missing 9
[function-audit] product-create … dead 0 / 31, missing 11
[function-audit] projects … dead 0 / 24, missing 19
[function-audit] projects-new … dead 0 / 15, missing 6
[function-audit] pipeline … dead 0 / 34, missing 15
[function-audit] library … dead 0 / 38, missing 10
[function-audit] account … dead 0 / 26, missing 4
[function-audit] team … dead 0 / 17, missing 4
[function-audit] messages … dead 0 / 28, missing 9
[function-audit] asset-factory … dead 0 / 24, missing 5
[function-audit] image-optimize … dead 2 / 24, missing 12
[function-audit] model-photo … dead 0 / 32, missing 8
[function-audit] model-photo-demo-a … dead 0 / 38, missing 5
[function-audit] model-photo-demo-b … dead 0 / 37, missing 5
[function-audit] platform-cover … dead 0 / 38, missing 8
[function-audit] settings … dead 0 / 26, missing 9
[function-audit] summary
┌─────────┬──────────────────────┬───────┬───────┬──────┬───────┬─────────┐
│ (index) │ page │ total │ works │ dead │ error │ missing │
├─────────┼──────────────────────┼───────┼───────┼──────┼───────┼─────────┤
│ 0 │ 'dashboard' │ 25 │ 20 │ 0 │ 0 │ 18 │
│ 1 │ 'products' │ 25 │ 24 │ 0 │ 0 │ 6 │
│ 2 │ 'product-detail' │ 29 │ 22 │ 0 │ 0 │ 9 │
│ 3 │ 'product-create' │ 31 │ 25 │ 0 │ 0 │ 11 │
│ 4 │ 'projects' │ 24 │ 15 │ 0 │ 0 │ 19 │
│ 5 │ 'projects-new' │ 15 │ 15 │ 0 │ 0 │ 6 │
│ 6 │ 'pipeline' │ 34 │ 26 │ 0 │ 0 │ 15 │
│ 7 │ 'library' │ 38 │ 23 │ 0 │ 0 │ 10 │
│ 8 │ 'account' │ 26 │ 20 │ 0 │ 0 │ 4 │
│ 9 │ 'team' │ 17 │ 17 │ 0 │ 0 │ 4 │
│ 10 │ 'messages' │ 28 │ 20 │ 0 │ 0 │ 9 │
│ 11 │ 'asset-factory' │ 24 │ 23 │ 0 │ 0 │ 5 │
│ 12 │ 'image-optimize' │ 24 │ 21 │ 2 │ 0 │ 12 │
│ 13 │ 'model-photo' │ 32 │ 31 │ 0 │ 0 │ 8 │
│ 14 │ 'model-photo-demo-a' │ 38 │ 33 │ 0 │ 0 │ 5 │
│ 15 │ 'model-photo-demo-b' │ 37 │ 34 │ 0 │ 0 │ 5 │
│ 16 │ 'platform-cover' │ 38 │ 35 │ 0 │ 0 │ 8 │
│ 17 │ 'settings' │ 26 │ 25 │ 0 │ 0 │ 9 │
└─────────┴──────────────────────┴───────┴───────┴──────┴───────┴─────────┘
报告:core/qa/function-audit/output/summary.md
@@ -2,15 +2,15 @@
"name": "settings",
"route": "/settings",
"url": "http://127.0.0.1:5173/settings",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 26,
"works": 25,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 1,
"skipped": 1,
"noop": 0,
"blocked": 0
},
"results": [
@@ -64,7 +64,7 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 14,
"mutations": 15,
"api": 0
}
},
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -280,7 +280,7 @@
"url": false,
"overlay": false,
"self": false,
"mutations": 47,
"mutations": 48,
"api": 11
}
},
@@ -293,13 +293,13 @@
"href": "#sec-profile",
"disabled": false,
"active": true,
"verdict": "noop-active",
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
"api": 1
}
},
{
@@ -317,7 +317,7 @@
"overlay": false,
"self": true,
"mutations": 6,
"api": 0
"api": 1
}
},
{
@@ -353,7 +353,7 @@
"overlay": false,
"self": true,
"mutations": 6,
"api": 0
"api": 3
}
},
{
@@ -370,8 +370,8 @@
"url": false,
"overlay": false,
"self": true,
"mutations": 6,
"api": 0
"mutations": 21,
"api": 2
}
},
{
@@ -388,16 +388,70 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 8,
"mutations": 2,
"api": 0
}
},
{
"idx": 21,
"tag": "select",
"role": "",
"cls": "select",
"label": "system",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 17,
"api": 0
}
},
{
"idx": 22,
"tag": "select",
"role": "",
"cls": "select",
"label": "zh",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
}
},
{
"idx": 23,
"tag": "select",
"role": "",
"cls": "select",
"label": "standard",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 0,
"api": 0
}
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "btn.btn-sm",
"label": "上传新头像",
"cls": "x.modal-x",
"label": "关闭",
"href": "",
"disabled": false,
"active": false,
@@ -406,87 +460,26 @@
"url": false,
"overlay": true,
"self": false,
"mutations": 8,
"api": 0
}
},
{
"idx": 22,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost.btn-sm",
"label": "恢复默认",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 45,
"api": 11
}
},
{
"idx": 23,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost.btn-sm",
"label": "验证",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 23,
"api": 0
}
},
{
"idx": 24,
"tag": "button",
"role": "",
"cls": "btn.btn-ghost.btn-sm",
"label": "更换",
"href": "",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": false,
"overlay": false,
"self": false,
"mutations": 23,
"mutations": 2,
"api": 0
}
},
{
"idx": 25,
"tag": "a",
"role": "",
"cls": "row-link",
"label": "管理团队 →",
"href": "#team",
"disabled": false,
"active": false,
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"self": false,
"mutations": 22,
"api": 0
}
"label": "",
"tag": "",
"verdict": "stale"
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"账户"
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户",
"上传新头像",
"恢复默认",
"验证",
"更换",
"管理团队 →"
]
}
@@ -1,13 +1,18 @@
# 功能审计 · settings
路由:`/settings` · 模式:isolated
合计 26 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 1 · ⚪ disabled 0
路由:`/settings` · 模式:quick
合计 26 · ✅ works 25 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)1 · ◷ noop-active 0 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 上传新头像
- 恢复默认
- 验证
- 更换
- 管理团队 →
+157 -13
View File
@@ -1,26 +1,158 @@
[
{
"page": "asset-factory",
"page": "dashboard",
"blocked": 0,
"total": 24,
"total": 25,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 5,
"noop": 0,
"missing": 18
},
{
"page": "products",
"blocked": 0,
"total": 25,
"works": 24,
"dead": 0,
"error": 0,
"disabled": 1,
"skipped": 0,
"noop": 0,
"missing": 6
},
{
"page": "product-detail",
"blocked": 0,
"total": 29,
"works": 22,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 2,
"missing": 4
"skipped": 6,
"noop": 1,
"missing": 9
},
{
"page": "image-optimize",
"page": "product-create",
"blocked": 0,
"total": 31,
"works": 25,
"dead": 0,
"error": 0,
"disabled": 1,
"skipped": 5,
"noop": 0,
"missing": 11
},
{
"page": "projects",
"blocked": 0,
"total": 24,
"works": 24,
"works": 15,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 9,
"noop": 0,
"missing": 19
},
{
"page": "projects-new",
"blocked": 0,
"total": 15,
"works": 15,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 0,
"missing": 6
},
{
"page": "pipeline",
"blocked": 0,
"total": 34,
"works": 26,
"dead": 0,
"error": 0,
"disabled": 8,
"skipped": 0,
"noop": 0,
"missing": 15
},
{
"page": "library",
"blocked": 0,
"total": 38,
"works": 23,
"dead": 0,
"error": 0,
"disabled": 1,
"skipped": 13,
"noop": 1,
"missing": 10
},
{
"page": "account",
"blocked": 0,
"total": 26,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 5,
"noop": 1,
"missing": 4
},
{
"page": "team",
"blocked": 0,
"total": 17,
"works": 17,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 0,
"missing": 4
},
{
"page": "messages",
"blocked": 0,
"total": 28,
"works": 20,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 7,
"noop": 1,
"missing": 9
},
{
"page": "asset-factory",
"blocked": 0,
"total": 24,
"works": 23,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 1,
"missing": 5
},
{
"page": "image-optimize",
"blocked": 0,
"total": 24,
"works": 21,
"dead": 2,
"error": 0,
"disabled": 0,
"skipped": 0,
"noop": 1,
"missing": 12
},
{
@@ -33,29 +165,29 @@
"disabled": 0,
"skipped": 0,
"noop": 1,
"missing": 7
"missing": 8
},
{
"page": "model-photo-demo-a",
"blocked": 0,
"total": 37,
"total": 38,
"works": 33,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 1,
"noop": 3,
"skipped": 4,
"noop": 1,
"missing": 5
},
{
"page": "model-photo-demo-b",
"blocked": 0,
"total": 37,
"works": 36,
"works": 34,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 0,
"skipped": 2,
"noop": 1,
"missing": 5
},
@@ -70,5 +202,17 @@
"skipped": 1,
"noop": 2,
"missing": 8
},
{
"page": "settings",
"blocked": 0,
"total": 26,
"works": 25,
"dead": 0,
"error": 0,
"disabled": 0,
"skipped": 1,
"noop": 0,
"missing": 9
}
]
+18 -6
View File
@@ -1,15 +1,27 @@
# 功能审计汇总
生成时间:2026-06-09T07:56:41.981Z · 模式:isolated
生成时间:2026-06-10T09:29:34.278Z · 模式:quick
| 页面 | 合计 | ✅works | ❌dead | 🛑error | ⏭skip | 🔍missing | 状态 |
|---|---|---|---|---|---|---|---|
| asset-factory | 24 | 22 | **0** | 0 | 0 | 4 | |
| image-optimize | 24 | 24 | **0** | 0 | 0 | 12 | |
| model-photo | 32 | 31 | **0** | 0 | 0 | 7 | |
| model-photo-demo-a | 37 | 33 | **0** | 0 | 1 | 5 | |
| model-photo-demo-b | 37 | 36 | **0** | 0 | 0 | 5 | |
| dashboard | 25 | 20 | **0** | 0 | 5 | 18 | |
| products | 25 | 24 | **0** | 0 | 0 | 6 | |
| product-detail | 29 | 22 | **0** | 0 | 6 | 9 | |
| product-create | 31 | 25 | **0** | 0 | 5 | 11 | |
| projects | 24 | 15 | **0** | 0 | 9 | 19 | |
| projects-new | 15 | 15 | **0** | 0 | 0 | 6 | |
| pipeline | 34 | 26 | **0** | 0 | 0 | 15 | |
| library | 38 | 23 | **0** | 0 | 13 | 10 | |
| account | 26 | 20 | **0** | 0 | 5 | 4 | |
| team | 17 | 17 | **0** | 0 | 0 | 4 | |
| messages | 28 | 20 | **0** | 0 | 7 | 9 | |
| asset-factory | 24 | 23 | **0** | 0 | 0 | 5 | |
| image-optimize | 24 | 21 | **2** | 0 | 0 | 12 | |
| model-photo | 32 | 31 | **0** | 0 | 0 | 8 | |
| model-photo-demo-a | 38 | 33 | **0** | 0 | 4 | 5 | |
| model-photo-demo-b | 37 | 34 | **0** | 0 | 2 | 5 | |
| platform-cover | 38 | 35 | **0** | 0 | 1 | 8 | |
| settings | 26 | 25 | **0** | 0 | 1 | 9 | |
- ⛔blocked = 页面始终落登录页/未就绪(后端或远程库不可用),**未审计**,非「0 缺陷」。修好后端再单独 `--only <page>` 复跑。
- ❌dead = 点了五路探针(URL/浮层/自身状态/网络/DOM)全无反应,优先修。
+17 -20
View File
@@ -2,7 +2,7 @@
"name": "team",
"route": "/team",
"url": "http://127.0.0.1:5173/team",
"mode": "isolated",
"mode": "quick",
"tally": {
"total": 17,
"works": 17,
@@ -100,7 +100,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 25,
"api": 0
}
},
@@ -136,7 +136,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 20,
"mutations": 24,
"api": 0
}
},
@@ -154,7 +154,7 @@
"url": true,
"overlay": false,
"self": true,
"mutations": 36,
"mutations": 37,
"api": 0
}
},
@@ -191,7 +191,7 @@
"overlay": false,
"self": true,
"mutations": 22,
"api": 0
"api": 1
}
},
{
@@ -244,8 +244,8 @@
"url": true,
"overlay": false,
"self": false,
"mutations": 19,
"api": 0
"mutations": 23,
"api": 1
}
},
{
@@ -278,9 +278,9 @@
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"overlay": false,
"self": false,
"mutations": 3,
"mutations": 4,
"api": 0
}
},
@@ -296,9 +296,9 @@
"verdict": "works",
"signals": {
"url": false,
"overlay": true,
"overlay": false,
"self": false,
"mutations": 3,
"mutations": 4,
"api": 0
}
},
@@ -314,20 +314,17 @@
"verdict": "works",
"signals": {
"url": true,
"overlay": false,
"overlay": true,
"self": false,
"mutations": 19,
"api": 0
"mutations": 24,
"api": 1
}
}
],
"missing": [
"搜索",
"李 小李的店",
"余额 ¥327.40",
"账户",
"编辑",
"重置密码",
"移出"
"E E2E 桥接测试团队 20260529",
"余额 ¥14,907.00",
"账户"
]
}
+3 -6
View File
@@ -1,16 +1,13 @@
# 功能审计 · team
路由:`/team` · 模式:isolated
路由:`/team` · 模式:quick
合计 17 · ✅ works 17 · ❌ **dead 0** · 🛑 error 0 · ⏭ skipped(破坏性)0 · ◷ noop-active 0 · ⚪ disabled 0
## 🔍 设计稿里有、React 没渲染出来的控件(MISSING · 启发式)
> 按控件文字与设计稿 `/exact` 对比,可能含装饰/动态文案误报,人工过一眼。
- 搜索
- 李 小李的店
- 余额 ¥327.40
- E E2E 桥接测试团队 20260529
- 余额 ¥14,907.00
- 账户
- 编辑
- 重置密码
- 移出
+107
View File
@@ -0,0 +1,107 @@
# AirShelf/core 全站测试报告 · 2026-06-10
> 依据 `test-agent.md` 四层测试体系(A 代码 → B/E 浏览器 → D 端到端 → C 报告)。
> 数据策略:**全真实数据**(真实后端 127.0.0.1:8010 + 真实 SQLite,禁 mock)。
> 不重新生成视频(用户指定);其余链路全测,含团队 / 成员 / 消费多用户场景。
## 测试概览
| 层 | 范围 | 结果 |
|---|---|---|
| A 代码 | 后端 Django test + 前端 tsc + vite build | ✅ 后端 10/10(原 8 + 新增 2 充值权限回归)· tsc 0 错 · build 成功 |
| B/E 浏览器 | 登录/工作台/商品/项目/资产/图片生成/团队/消费/消息/设置 + pipeline 五阶段 | ✅ 逐页控制台无 P0 报错,截图人审通过 |
| D 端到端 | 多用户(owner+成员)权限 / 数据隔离 / 限额 / 账单归属 | ✅ 发现 1 个 P0 越权 bug 已修 |
| E 移动端 | iPhone 13 视口逐页 | ✅ 发现 2 个移动端 bug 已修 |
**判定:首轮发现 9 个 bug(8 修复 + 1 确认非缺陷),全部复验通过。**
---
## Bug 清单(全部已修复并复验)
| # | 严重度 | 类型 | 描述 | 定位 | 复验 |
|---|---|---|---|---|---|
| 1 | **P0** | 权限越权 | **普通成员能给团队充值**:`POST /api/billing/recharge/` 只校验登录不校验角色,成员调用返回 201 并真实加钱(实测余额 ¥14906→¥15006) | `apps/billing/views.py:recharge` | 成员调用→403;owner→201;加回归测试 2 条 |
| 2 | P1 | 功能缺失 | **设置页「退出登录」点确认无反应**:`onLogout` 没从 App 传进 SettingsPage,确认按钮只关弹窗不退登 | `App.tsx` + `routes/settings.tsx` | 确认→清 token→跳 /login ✓ |
| 3 | P1 | 移动端可用性 | **窄屏无法导航**:`@media(max-width:1100px)` 把侧栏和收窄键都 `display:none`,移动端没有任何菜单入口 | `design-restraint.css` + `components/app-shell.tsx` | 新增汉堡键+抽屉+遮罩,点导航跳转并自动收起 ✓ |
| 4 | P1 | 移动端布局 | **宽数据表被裁切**:项目列表(715px)/成员表/账单表在窄屏溢出且无横向滚动,右侧列(状态/操作)点不到 | `design-restraint.css` + projects/team/account.tsx | 包 `overflow-x:auto` 容器,表内横向滚动,页面不再侧滑 ✓ |
| 5 | P2 | 文案 | **登录失败提示英文**:错误密码/空提交弹后端原文 `invalid credentials` | `routes/auth-screen.tsx` | 映射成「邮箱或密码不正确」✓ |
| 6 | P2 | 安全/体验 | **登录页预填设计稿假账号** `li@shop.com / demo-1234`,真实环境误导 | `routes/auth-screen.tsx` | 字段从空开始 + 前端必填校验 ✓ |
| 7 | P2 | 体验 | **新建项目默认名固定 v1**:连建多个项目重名,易混淆 | `routes/projects.tsx` | 按已有项目自动递增 v1→v2…实测「南卡·痛点种草·v2」✓ |
| 8 | P2 | 体验 | **慢操作无反馈**:新建项目「开始」、上传资产「上传资产」按钮点击后无 loading 态,用户疑似没点上 | projects.tsx / library.tsx | 加「创建中…」「上传中…」禁用态 ✓ |
| 9 | P2 | 体验 | **建成员失败丢表单**:用户名重复等失败时弹窗仍关闭并清空,要重填 | `routes/team.tsx` | 失败保留弹窗与已填内容,仅成功才清 ✓ |
> 移动端统计卡标签竖排("总/项/目")一并修复(加 `.stat .lbl { white-space: nowrap }`)。
---
## D 层 · 多用户 / 消费链路验证(真实数据)
| 验证项 | 方法 | 结果 |
|---|---|---|
| 建成员 | 团队页创建 `qa-member-0610`,月限额 ¥1 | ✅ 落库,成员表出现 |
| 成员登录 | 该成员凭证登录 | ✅ 进工作台,身份=成员、团队=同团队 |
| 数据共享(同团队) | 成员可见团队 8 商品 | ✅ TeamScopedViewSetMixin 按 team 过滤 |
| 数据隔离(跨团队) | 各团队 product/project queryset 按 team 隔离 | ✅ 结构性强隔离 |
| 权限·改他人限额 | 成员 PATCH owner 限额 | ✅ 403 |
| 权限·建成员 | 成员 POST members | ✅ 403 |
| 权限·充值 | 成员 POST recharge | ❌→✅ **修复前 201(bug#1),修复后 403** |
| 月限额拦截 | `_enforce_member_monthly_limit` 限额 ¥1 | ✅ ¥1 任务放行、¥2 拦截 |
| 账单归属 | ledger 带 `user`/`user_label`,成员列消费可追溯 | ✅ 每笔扣费挂触发人 |
测试数据已清理:QA 成员已删、误充 ¥100 已回退(余额复原 ¥14906)、QA 测试商品/项目/音频资产均删除。
---
## A 层 · 代码测试输出
```
后端:python manage.py test --settings=airshelf.settings.test
Ran 10 tests — OK(新增 RechargePermissionTests: owner 可充值 / 成员 403 余额不变)
前端:tsc --noEmit → 0 errors
vite build → 成功
```
## 环境
| 服务 | 状态 | 说明 |
|---|---|---|
| 后端 Django | ✅ 127.0.0.1:8010 | .venv/bin/python · SQLite · StatReloader 热载 |
| 前端 Vite | ✅ 127.0.0.1:5173 | 真实 /api 代理 |
| Playwright | ✅ headed chromium | MCP 驱动,iPhone 13 视口测移动端 |
---
## 资金核算深度审计(2026-06-11 补)
> 用户追问"数据流转、金额核算有没有出错"。写了核算审计脚本 `qa/audit_billing.py`,对真实 DB **17 个团队账户**逐条验证 8 项账目不变量。
| 不变量 | 含义 | 结果 |
|---|---|---|
| I1 余额=流水终点 | `account.balance` == 末条动账流水 `balance_after` | ✅ 全过 |
| I2 冻结自洽 | `reserved_balance` == Σ(ACTIVE 预留) | ✅ 全过 |
| I3 非负&可用 | balance/reserved ≥ 0 且 balance ≥ reserved | ✅ 全过 |
| I4 预留闭环 | reservation 状态与扣费/释放流水一致,扣费 ≤ 预留 | ✅ 全过 |
| I5 失败不扣费 | 失败/取消 task 的预留不得为 CHARGED | ✅ 全过 |
| I6 无重复扣费 | 同 task 不得多扣(净额=预留) | ✅ 全过 |
| **I7 逐笔差分自洽** | **每条 `balance_after` == 前一条 ± 本笔金额** | ✅ 全过 |
| I8 流水完整 | 开户额度有 genesis 凭证(可从首条对账) | ✅ 修复后全过 |
**结论:金额核算零错误。** 每个账户余额、冻结、逐笔差分账都精确自洽,无多扣/少扣/重复扣/冻结泄漏。
### 审计中查实的两件事
1. **历史双扣(已自愈,账平)**:`E2E 桥接测试团队` task `8b9745b8` 在 2026-06-10 03:08:25 同秒两条 ¥1 扣费(并发竞态历史脏数据),但 06:32 已有一条 `adjustment +¥1` 回冲,净扣 ¥1=预留 ¥1。当前 `charge_reserved_credit` 已加 `select_for_update` 锁内重读幂等,不会复发。
2. **Bug #10(P1 可审计性)· 开户赠送额度不进流水**:注册开户(`accounts/serializers.py`)给 `DEFAULT_TRIAL_CREDITS` 试用额度直接写进 `balance`,**不记任何 ledger**。后果:这笔钱在账单流水里查无凭证,无法对账、无法向用户解释余额来源(17 个账户全中)。
- **余额数字本身没错**(初始额度 + 流水净额 = 真实余额,逐团队核对分毫不差),纯属可审计性缺陷。
- **修复**:开户时补记一条 `recharge` 赠送流水(`balance_after`=赠送额),加回归测试 `test_register_trial_grant_is_recorded_in_ledger`;历史 17 个账户用 `qa/backfill_genesis_ledger.py` 回填 genesis 凭证(**只补凭证,不动余额**)。回填后审计 I8 全过。
> 复跑审计:`cd backend && DJANGO_SETTINGS_MODULE=airshelf.settings.development .venv/bin/python ../qa/audit_billing.py` → `✓ 全部账户账目自洽,无金额核算错误`。后端测试 11/11。
---
## 遗留 / 未测(用户指定跳过)
- **视频生成 / 拼接导出**:用户指定不重跑。pipeline 五阶段页面渲染、弹窗、控制台已查,生成动作本身未触发。
- 真实第三方(火山 ARK / TOS)出图出片未联网触发。