{
  "audit_date": "2026-09-16",
  "rule": "自建页面高频动作必须首页直达(卡片级按钮),禁止只藏在下钻抽屉/详情页/模态里",
  "totals": { "P1": 4, "P2": 6, "P3": 0 },
  "scope_notes": [
    "/data/workspace/kais-aigc-platform/src/pages/ 不存在(该 src 为后端),前端页面实际在 packages/portal/src/pages/,已审计",
    "静态 HTML 页(2026-09,Hermes 一次性产物)只做模式级结论,见 static_html_summary"
  ],
  "findings": [
    {
      "file": "/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/StoryboardTimeline.tsx",
      "line": "1207",
      "level": "P1",
      "action": "审核判定(✓通过 / ✕驳回)",
      "problem": "时间轴每行 ReviewBadge(1207)为纯展示 span 无 onClick(835-859),头部统计栏(2915-2917)突出审核计数说明本页即审片工作流,但整页无行级审核按钮,详情面板也无;唯一活入口是画布节点右键菜单(CanvasContextMenu),需跨视图操作",
      "fix": "在 ShotRow 的 ReviewBadge 旁(1207 处)对待审行挂已建好的 ReviewActionButtons,文案「✓ 通过 / ✕ 驳回」,详情面板保留完整审核面",
      "clicks_to_reach": 4,
      "component": "ShotRow / ReviewBadge",
      "evidence": "1207: <ReviewBadge status={node.reviewStatus} /> // 纯展示;2915-2917: ✓/○/✕ 统计;835-859: ReviewBadge 为 <span> 无 onClick"
    },
    {
      "file": "/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/panel/NodeDetailPanel.tsx",
      "line": "553",
      "level": "P1",
      "action": "剧本变体选定(审核选定 alpha/beta/gamma)",
      "problem": "ReviewCard 全 src 仅此一处引用,只挂在详情抽屉 detail tab 的 ReviewSection(pending 时渲染),画布节点卡与列表层无入口,卡片审核角标为纯展示;选定动作 3 击全程藏在下钻抽屉",
      "fix": "画布 script 节点卡加直达按钮「🔍 选定变体」,点击开抽屉并锚定审核区,或卡内内联三选一 chip",
      "clicks_to_reach": 3,
      "component": "ReviewSection / ReviewCard",
      "evidence": "551: {rs === 'pending' && ( 553: <ReviewCard filePath={...} nodeId={node.id} />;全包 grep 仅本文件 import ReviewCard"
    },
    {
      "file": "/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/pipeline/NodeDetailPanel.tsx",
      "line": "162",
      "level": "P1",
      "action": "待决策资产的选定(选 winner)",
      "problem": "DAG 节点卡在卡片层高调提示「⚠N待选」(DagNode.tsx:211-217,title「N 个资产待决策」),头部有待决策统计 chip,但抽屉内待选资产缩略图点击 only 跳画布定位(onLocate),无任何选定/去选片按钮,需跨两视图 ≥4 击",
      "fix": "抽屉「资产」区头部加「去画布选片 →」按钮,或给 ○待选 缩略图加行内「★ 选定」小按钮",
      "clicks_to_reach": 4,
      "component": "NodeDetailPanel (pipeline) / AssetThumb",
      "evidence": "162: <AssetThumb key={a.nodeId} asset={a} onClick={() => onLocate(a.nodeId)} />;DagNode.tsx 216: ⚠{candidates}待选"
    },
    {
      "file": "/data/workspace/kais-aigc-platform/packages/portal/src/pages/PortalHome.tsx",
      "line": "181",
      "level": "P1",
      "action": "成片终审 放行/驳回(审核判定)",
      "problem": "终审动作只存在于 /deliver/:ep 详情页(DeliveryPage.tsx:205 终审动作条),门户集行仅「画布/交付」导航链接;且 181 行 PipelineRibbon 用 micro 档不传 gates(gate 四态点仅 full 档渲染,PipelineRibbon.tsx:96,121-122),首页连「哪集待我决策」都不可见,只能逐集盲进详情页",
      "fix": "集行 PipelineRibbon 后加终审直达:pending 集渲染状态点+主按钮「放行」(复用 lib/gateOpsFlow)+ghost 钮「驳回→」跳交付页;最低限度传入 gates 或加「待终审」徽章",
      "clicks_to_reach": 2,
      "component": "PortalHome 集行 episode row",
      "evidence": "181: <PipelineRibbon projectId={p.id} ep={r.ep} counts={r.phases} /> // 无 gates;183/186: <a>画布</a> <a>交付</a>"
    },
    {
      "file": "/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/ReviewActionButtons.tsx",
      "line": "89",
      "level": "P2",
      "action": "审核通过 / 驳回(卡片级直达按钮)",
      "problem": "专为卡片角设计的 ✓通过/✕驳回 组件已建成且带 title,但全 src 无任何文件 import 挂载(仅 CanvasContextMenu.tsx:133 注释提及),是死代码;且 btnBase opacity:0(146 行)hover 才显,即便挂载也是 hover-only。活的审核入口只有无视觉提示的右键菜单",
      "fix": "挂到 AssetCardNode 卡片角,待审时常显(去掉 opacity:0),文案沿用「✓ 审核通过 / ✕ 驳回」",
      "clicks_to_reach": 2,
      "component": "ReviewActionButtons",
      "evidence": "89: <button onClick={handleApprove} ... title=\"审核通过\">;146: opacity: 0;全包 grep 无 import"
    },
    {
      "file": "/data/workspace/kais-aigc-platform/packages/infinite-canvas/src/components/assetManager/AssetLibrary.tsx",
      "line": "391",
      "level": "P2",
      "action": "📍 定位(资产→画布交叉定位)",
      "problem": "定位按钮有 title 但 CSS 为 display:none、仅 .am-card:hover 才 display:flex(assetManager.css:114-117),hover-only 隐藏入口,新用户无法发现,触屏不可用",
      "fix": "改为常显(与同卡片「★ 选定」同策略 opacity .9 常显),图标/title 不变",
      "clicks_to_reach": 1,
      "component": "renderAssetCard (am-card__locate)",
      "evidence": "css 114: .am-card__locate{...display:none};css 117: .am-card:hover .am-card__locate{display:flex};393: title=\"在画布上定位此资产\""
    },
    {
      "file": "/data/workspace/kais-story-map/src/pages/Analysis.tsx",
      "line": "1535",
      "level": "P2",
      "action": "采纳改稿建议(「交给 Agent 处理」)",
      "problem": "5 条建议的采纳入口只渲染在手风琴展开层内(1476 行 setOpenIdx 开关),折叠态列表无任何动作按钮,需逐条展开找入口;SectionHeader 自称「可一键交给 Agent」与实际不符(仅第 1 条默认展开)",
      "fix": "折叠态建议行尾(场号 chip 与 ChevronDown 间)加常驻小按钮「交给 Agent」,e.stopPropagation 与展开互不影响;展开层保留原 Link",
      "clicks_to_reach": 2,
      "component": "RevisionList",
      "evidence": "1476: onClick={() => setOpenIdx(open ? null : i)};1535: 交给 Agent 处理 // 仅 open 面板内渲染"
    },
    {
      "file": "/data/workspace/kais-story-map/src/pages/Cases.tsx",
      "line": "432",
      "level": "P2",
      "action": "进入解剖(打开案例详情)",
      "problem": "卡片可点(role=button 400 行,onClick 402 行),但唯一行动提示「进入解剖」在 hover 叠加层:默认 translate-y-full 移出可视区仅 group-hover 升起,且整层 pointer-events-none(432);静止态卡片无可发现入口,触屏更差",
      "fix": "卡体底部统计行下方加常驻文字按钮「进入解剖 →」(amber),hover 叠加层保留为增强",
      "clicks_to_reach": 1,
      "component": "CaseCard",
      "evidence": "432: <div className=\"pointer-events-none absolute inset-0 flex translate-y-full ... group-hover:translate-y-0\">;441: 进入解剖"
    },
    {
      "file": "/data/workspace/kais-story-map/src/pages/Cases.tsx",
      "line": "955",
      "level": "P2",
      "action": "在关系图谱中打开该案例(选定进入工作台)",
      "problem": "从案例进入工作台的唯一入口藏在 CaseModal 底部:需发现 hover 层→点卡片开模态→再点链接,全部依赖下钻模态,卡片层无直达;demo 案例《夜航》属高频跳转",
      "fix": "卡片 hover 叠加层「进入解剖」旁(或卡体统计行)加次级直达链接「在图谱中打开」,stopPropagation 避免触发开模态",
      "clicks_to_reach": 2,
      "component": "CaseModalBody",
      "evidence": "955: 在关系图谱中打开 // <Link to=\"/graph\"> 仅存在于 CaseModal 内"
    },
    {
      "file": "/data/workspace/kais-story-map/src/components/home/FinalCTA.tsx",
      "line": "68",
      "level": "P2",
      "action": "免费开始解剖(首页底部主转化 CTA)",
      "problem": "按钮在首页显著位置可见,但全文件 grep onClick 零命中,点击完全无响应——入口失效;同名动作在 Navbar 与 Hero 有可用直达故不定 P1",
      "fix": "加 onClick 跳 '/agent'(或退化为 <Link to=\"/agent\">),输入框非空时带入文本,文案保持「免费开始解剖」",
      "clicks_to_reach": 1,
      "component": "FinalCTA",
      "evidence": "68: 免费开始解剖 // <button> 无 onClick;文件内 grep onClick 计数=0"
    }
  ],
  "static_html_summary": {
    "pages_sampled": 8,
    "overall": "整体合规:评审/盲选页严格同构,主流模式为「卡片/行级直达判定按钮 + 底部 position:fixed 固定导出条(📋复制发回群里)」,开页到判定并导出全程 2 击,优于三击及格线,无高频动作藏入二级视图;系统性短板为全部 8 页无键盘快捷键",
    "counter_examples": [
      "/home/kai/shared/2026-09-04/zimage_4k_compare.html — 对比页无任何选定/导出动作入口",
      "/home/kai/shared/2026-09-02/ep01_iter_v3_review.html — select 下拉打分(单次 2 击)+ sticky 而非 fixed 导出条,半合规"
    ]
  },
  "compliant_examples": [
    "infinite-canvas assetManager/AssetLibrary.tsx:397-421 三态流转卡片级常显「★选定/✕取消选定/↻恢复」+ AssetDetail 抽屉完整操作面(教科书式合规)",
    "infinite-canvas badges/NodeBadges.tsx:82-89 stale 角标卡片级可点重跑 + panel/NodeDetailPanel.tsx:1155-1162 抽屉完整按钮(双出口)",
    "portal DeliveryPage.tsx:205 终审动作条 / gate/GateCenterBlock.tsx:236-258 sticky 三键 / variants/VariantWall.tsx:480-492 选定常显 / g15/g16 面板 sticky 批量动作条",
    "story-map Graph.tsx:1366-1501 工具条全 1 击直达且 icon 钮带 title/aria-label;Agent.tsx:647-656 卡片级「运行」+ 2 击内完成接受/丢弃"
  ]
}
