# KAP 自建页面「高频动作首页直达」UI 合规审计报告

- **审计日期**:2026-09-16
- **审计依据**:用户令(2026-09-13)——自建页面的高频动作必须首页直达(卡片级按钮),禁止把高频动作只藏在下钻抽屉/详情页里
- **审计方式**:只读审计,未改动任何被审计文件
- **结果总览**:**P1 × 4 / P2 × 6 / P3 × 0**(另含静态 HTML 页模式级结论)

## 审计范围确认

| 目标 | 状态 |
|---|---|
| `packages/infinite-canvas/src/components/`(重点 9 项 + assetManager/ panel/ pipeline/ 全目录) | ✅ 已扫,30+ 文件 |
| `/data/workspace/kais-aigc-platform/src/pages/` | ⚠️ **不存在**(该 src 为后端代码);前端页面实际位于 `packages/portal/src/pages/`,已代为审计(2 页) |
| `/data/workspace/kais-story-map/src/`(pages/ + components/home/ + components/emotion/) | ✅ 已扫,27 文件 |
| `/home/kai/shared/` 2026-09 静态审核/盲选 HTML | ✅ 抽样 8 页,模式级结论(见末节) |

---

## P1 违规(高频动作只在下钻层,列表/卡片层无直达)

### P1-1 分镜时间轴:审核判定(通过/驳回)无行级入口,须跨视图 4 击

- **文件**:`/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/StoryboardTimeline.tsx:1207`(另见 835-859、2915-2917)
- **高频动作**:审核判定 ✓通过 / ✕驳回(本页即审片工作流,头部统计栏 2915-2917 行突出显示 ✓/○/✕ 计数)
- **问题**:每行渲染的 `ReviewBadge`(1207 行)是纯展示 `<span>`、无 onClick(835-859 行实证);双击行进详情面板后同样没有通过/驳回按钮,**全平台唯一活的审核入口是画布节点的右键上下文菜单**(CanvasContextMenu 走 store.approveNode/rejectNode,已实证)。从时间轴页做一次审核判定需切视图+右键,约 4 击,且右键菜单无任何视觉提示。
- **修复建议**:在 ShotRow 的 ReviewBadge 旁(1207 行处)对待审行直接挂已建好的 `ReviewActionButtons` 组件,文案「✓ 通过 / ✕ 驳回」,详情面板保留完整审核面。
- **复现路径**:时间轴页 → 切到画布视图(1)→ 找到对应节点(2)→ 右键节点(3)→ 点「审核通过/驳回」(4)= **4 击**
- **证据**:
  ```
  1207: <ReviewBadge status={node.reviewStatus} />   // 纯展示
  2915-2917: ✓ {stats.approved} ○ {stats.pending} ✕ {stats.rejected}
  835-859: ReviewBadge 为 <span>,无 onClick
  ```

### P1-2 详情抽屉:剧本变体选定(ReviewCard)只在抽屉 detail tab,3 击全程下钻

- **文件**:`/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/panel/NodeDetailPanel.tsx:553`(import 于 24 行)
- **高频动作**:剧本变体选定 alpha/beta/gamma(「选定」核心业务动作)
- **问题**:`ReviewCard` 全 src 仅此一处引用(已 grep 实证),只挂在详情抽屉 pending 状态的 ReviewSection 里;画布节点卡与任何列表层均无入口,卡片右下角审核角标(NodeBadges)也是纯展示圆点。用户必须双击节点开抽屉 → 滚到「审核」区 → 点「选择 X」→ 再确认,全程藏在下钻层。
- **修复建议**:在画布 script 节点卡上加直达按钮,文案「🔍 选定变体」,点击直接开抽屉并锚定审核区(或卡内内联三选一 chip)。
- **复现路径**:画布 → 双击节点(1)→ 滚动到审核区、点「选择 X」(2)→ 点击确认(3)= **3 击**(全程下钻层内)
- **证据**:
  ```
  551: {rs === 'pending' && (
  553:   <ReviewCard filePath={asset.media.original ?? undefined} nodeId={node.id} />
  // 全包 grep:ReviewCard 仅本文件 import
  ```

### P1-3 管线视图:待决策资产的选定 ≥4 击且跨视图,抽屉内无动作

- **文件**:`/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/pipeline/NodeDetailPanel.tsx:162`(另见 pipeline/DagNode.tsx:211-217)
- **高频动作**:待决策资产选定 winner(本页核心业务;DAG 节点卡 211-217 行高调提示「⚠N待选」、视图头部有待决策统计 chip)
- **问题**:卡片层只负责"提示有待决策",点击节点开的抽屉里,待选资产缩略图点击 only 跳画布定位(onLocate),抽屉内无任何选定/去选片按钮。用户要:点节点 → 点缩略图跳画布 → 再开变体墙 → 选定,跨两个视图。
- **修复建议**:在抽屉「资产」区头部加按钮,文案「去画布选片 →」(或给 ○待选 缩略图加行内「★ 选定」小按钮)。
- **复现路径**:管线页 → 点节点开抽屉(1)→ 点缩略图跳画布(2)→ 打开变体墙(3)→ 点选定(4)= **4 击**
- **证据**:
  ```
  162: <AssetThumb key={a.nodeId} asset={a} onClick={() => onLocate(a.nodeId)} />
  DagNode.tsx 216: ⚠{candidates}待选   // title="N 个资产待决策",仅提示
  ```

### P1-4 门户首页:成片终审放行/驳回只在交付详情页,集行连"待决策"都不可见

- **文件**:`/data/workspace/kais-aigc-platform/packages/portal/src/pages/PortalHome.tsx:181-186`(佐证:PortalHome 同级组件 `../components/PipelineRibbon.tsx:96, 121-122`;动作实际位置 DeliveryPage.tsx:205 终审动作条)
- **高频动作**:成片终审 放行/驳回(审核判定;30 分钟审片会话逐集操作 ≥3 次)
- **问题**:终审动作只存在于 `/deliver/:ep` 详情页(DeliveryPage 的 [放行]/[驳回] 动作条,已 grep 实证);门户集行内只有「画布」「交付」导航链接,且 181 行 `PipelineRibbon` 用 micro 档、**不传 gates**(gate 四态点仅 full 档渲染,见 PipelineRibbon.tsx 96/121-122)——收片人在首页连「哪一集正等我决策」都看不到,只能逐集点「交付」盲进详情页才发现 pending 状态。
- **修复建议**:在 PortalHome 集行 PipelineRibbon 之后加终审直达:对待终审集渲染 pending 状态点 + 小主按钮「放行」(复用 lib/gateOpsFlow 通道)+ ghost 钮「驳回→」跳交付页;最低限度把 gates 传入集行 ribbon 或加「待终审」徽章,让待决策可发现。
- **复现路径**:门户首页 → 点集行「交付」(1)→ 交付页内点「放行」(2)= **2 击**,但首页无直达且待办不可发现(违反"高频动作只存在于详情页"之 P1 定义)
- **证据**:
  ```
  181: <PipelineRibbon projectId={p.id} ep={r.ep} counts={r.phases} />   // 无 gates prop
  183/186: <a ...>画布</a>  <a ...>交付</a>   // 行内仅导航链接
  PipelineRibbon.tsx 121-122: variant 'micro'|'full';gates 仅 full 档消费
  ```

---

## P2 违规(首页有入口但 >2 击 / 不可发现 / 入口失效)

### P2-1 卡片级审核按钮组件已建成却未挂载,且设计为 hover 才显

- **文件**:`/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/ReviewActionButtons.tsx:89, 146`
- **高频动作**:审核通过 / 驳回(卡片级直达按钮)
- **问题**:专为卡片角设计的 ✓通过/✕驳回 组件已建好且带 title,但**全 src 无任何文件 import 挂载**(grep 实证仅 CanvasContextMenu.tsx:133 注释提及)——是死代码,卡片层实际没有可见审核按钮;且 btnBase `opacity: 0`(146 行)hover 才显,即便挂载也是 hover-only。
- **修复建议**:把 ReviewActionButtons 挂到 AssetCardNode 卡片角,待审时常显(去掉 opacity:0),文案沿用「✓ 审核通过 / ✕ 驳回」。
- **复现路径**:现状:画布 → 右键节点(1)→ 点审核项(2)= 2 击,但右键入口无任何视觉 affordance,不可发现
- **证据**:
  ```
  89: <button onClick={handleApprove} style={approveBtnStyle} title="审核通过">
  146: opacity: 0,   // btnBase hover 才显
  ```

### P2-2 资产库:「📍 定位」按钮 hover-only 隐藏

- **文件**:`/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/assetManager/AssetLibrary.tsx:391-393` + 同目录 `assetManager.css:114-117`
- **高频动作**:资产→画布交叉定位(资产库高频导航动作)
- **问题**:定位按钮有 title「在画布上定位此资产」但 CSS `display:none`、仅 `.am-card:hover` 才 `display:flex`(已实证)——hover 才显示的隐藏入口,新用户无法发现,触屏不可用。
- **修复建议**:改为常显(与同卡片「★ 选定」按钮同策略,常显 opacity .9),文案/图标不变。
- **复现路径**:资产库 → 鼠标悬停卡片(0.5)→ 点「📍 定位」(1)= 1 击,但入口 hover-only 不可发现
- **证据**:
  ```
  css 114: .am-card__locate{...display:none;...}
  css 117: .am-card:hover .am-card__locate{display:flex}
  393: title="在画布上定位此资产"
  ```

### P2-3 剧核 Analysis 页:改稿建议「交给 Agent 处理」入口只在手风琴展开层

- **文件**:`/data/workspace/kais-story-map/src/pages/Analysis.tsx:1476, 1535`
- **高频动作**:采纳改稿建议(「交给 Agent 处理」,本页核心采纳类动作;SectionHeader 1665 行自称「可一键交给 Agent」)
- **问题**:5 条建议的采纳入口只渲染在手风琴展开层内,折叠态列表无任何动作按钮,用户需逐条展开才能找到入口;仅第 1 条默认展开可见,与「一键」文案不符。
- **修复建议**:在折叠态建议行尾(场号 chip 与 ChevronDown 之间)加常驻直达小按钮,文案「交给 Agent」,点击直接 navigate('/agent') 且 e.stopPropagation 与展开互不影响。
- **复现路径**:Analysis 页 → 点建议行展开(1)→ 点「交给 Agent 处理」(2)= 2 击,但折叠态不可发现
- **证据**:
  ```
  1476: onClick={() => setOpenIdx(open ? null : i)}   // 手风琴开关
  1535: 交给 Agent 处理   // Link 仅 open 面板内渲染
  ```

### P2-4 剧核案例库:「进入解剖」行动提示 hover-only,静止态卡片无可发现入口

- **文件**:`/data/workspace/kais-story-map/src/pages/Cases.tsx:400-402, 432, 441`
- **高频动作**:进入解剖(打开案例详情,案例库页首要动作)
- **问题**:卡片本身可点(role="button" 400 行、onClick 402 行),但唯一行动提示「进入解剖」放在 hover 叠加层:默认 `translate-y-full` 完全移出可视区,仅 group-hover 升起,且整层 `pointer-events-none`(432 行实证)。静止态卡片无任何操作提示;触屏设备无 hover,发现性更差。
- **修复建议**:在卡体底部统计行下方加常驻文字按钮「进入解剖 →」(amber 色),hover 叠加层保留为增强。
- **复现路径**:案例库 → 点卡片(1)= 1 击,但入口提示 hover-only 不可发现
- **证据**:
  ```
  432: <div className="pointer-events-none absolute inset-0 flex translate-y-full ... group-hover:translate-y-0">
  441: 进入解剖   // 非独立可点元素,叠加层内 span
  ```

### P2-5 剧核案例库:「在关系图谱中打开」唯一入口藏在详情模态底部

- **文件**:`/data/workspace/kais-story-map/src/pages/Cases.tsx:955`
- **高频动作**:选定案例进入图谱工作台(选定类核心动作,demo 案例高频跳转)
- **问题**:从案例进入实际工作台的唯一入口在 CaseModal 底部:需先发现 hover 层 → 点卡片开模态 → 再点链接,全部依赖下钻模态,卡片层无直达。
- **修复建议**:在卡片 hover 叠加层「进入解剖」旁(或卡体统计行)加次级直达链接「在图谱中打开」,stopPropagation 避免触发开模态。
- **复现路径**:案例库 → 点卡片开模态(1)→ 点模态底部「在关系图谱中打开」(2)= 2 击,全程依赖下钻模态
- **证据**:
  ```
  955: 在关系图谱中打开   // <Link to="/graph"> 仅存在于 CaseModal 内
  ```

### P2-6 剧核首页 FinalCTA:「免费开始解剖」按钮无 onClick,入口失效

- **文件**:`/data/workspace/kais-story-map/src/components/home/FinalCTA.tsx:57-71`(按钮文案于 68 行)
- **高频动作**:免费开始解剖(首页底部主转化 CTA)
- **问题**:按钮在首页显著位置且可见,但**全文件 grep onClick 零命中**(已实证)——点击完全无响应,比「藏」更硬性的阻断。同名动作在 Navbar 与 Hero 有可用直达,故不定 P1。
- **修复建议**:加 onClick 跳 '/agent'(或退化为 `<Link to="/agent">`),输入框非空时把粘贴文本带入,文案保持「免费开始解剖」。
- **复现路径**:首页 → 滚到底部点「免费开始解剖」(1)= 1 击,但无响应(0 击可达性)
- **证据**:
  ```
  68: 免费开始解剖   // <button> 无 onClick;文件内 grep onClick 计数 = 0
  ```

---

## 静态 HTML 页(2026-09 盲选/审核页)模式级结论

抽样 8 页(覆盖 09-02 至 09-13,blind/review/compare/demo 四类):

> **整体合规**。5 个评审/盲选页严格同构,主流模式为「卡片/行级直达判定按钮 + 底部 position:fixed 固定导出条(📋复制发回群里)」,从开页到完成判定并导出全程 **2 击**,优于三击及格线;导出条始终可见,无高频动作被藏进二级视图。两个边界反例:`2026-09-04/zimage_4k_compare.html` 完全没有选定/导出机制(若工作流期望回传 A/B 判定则无入口);`2026-09-02/ep01_iter_v3_review.html` 用 select 下拉打分(单次 2 击)且导出条是 sticky 而非 fixed,为半合规变体。系统性短板:全部 8 页均无键盘快捷键,长清单页效率完全依赖卡片级直达撑着。

## 合规范例(供修复时参照)

- **assetManager/AssetLibrary.tsx 三态流转(397-421 行)**:待选/选定/淘汰 tab 卡片分别常显「★ 选定」「✕ 取消选定」「↻ 恢复」,带 title 且 CSS 常显,1 击直达;双击开的 AssetDetail 抽屉保留完整操作面——**教科书式合规**。
- **画布 stale 重跑双出口**:NodeBadges.tsx:82-89 卡片层琥珀三角直接可点重跑下游(带 `<title>`),详情抽屉 NodeDetailPanel.tsx:1155-1162 另有完整「🔄 重跑下游」按钮——卡片直达 + 下钻完整操作面。
- **portal DeliveryPage.tsx:205 终审动作条 / gate/GateCenterBlock.tsx:236-258 三键 sticky 动作条 / variants/VariantWall.tsx:480-492 「选定」常显 / BlindSelectionOverlay.tsx:323-368 盲投直达 / g15/G15TriagePanel.tsx:157-197 批量豁免·重渲 sticky 条 / g16/G16VoiceWorkbench.tsx:322-349 重听·批量豁免直达**——portal 与 g15/g16/gate/variants/theater 面板的高频动作全部在列表/卡片层或 sticky 动作条直达,图标钮均带 title。
- **story-map Graph.tsx 工具条(1366-1501)**:搜索/筛选/布局/导出 JSON 全部 1 击直达,icon-only 按钮均带 title 或 aria-label;**Agent.tsx StationCard(647-656)** 卡片级「运行」+ 完成后「接受写入/丢弃」2 击内完成审核。

## 备注

- 被扫代码中未发现 P3(低频动作误占首页显著位)。
- 多处 ✕ 关闭钮无 title/aria-label(TheaterShell、VariantWall、G15TriagePanel、BlindSelectionOverlay),因关闭属低频动作,按判定标准不报。
- 本报告所有行号均经 grep/sed 逐条实证(2026-09-16)。

AUDIT_DONE 4/6/0
