ops-buglist.html 9.25 KB
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Ops · Buglist · LemonBoss PRD</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,500;9..144,700&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="assets/shell.css" />
</head>
<body data-page="ops-buglist.html">
<div class="shell">
  <aside id="sidebar"></aside>
  <main class="page">
    <header class="page-head">
      <div class="crumb"><span class="pill">07 · OPS</span><span class="sep">/</span><span>Buglist</span></div>
      <h1>Buglist · 跨 run 跨 unit 聚合视图</h1>
      <p class="deck">从 <code>bugs.ndjson</code> (M-14) 渲染。这是单/集成测试发现的所有 bug 的<b>统一台账</b>,含完整状态机轨迹(open → fixing → fixed → verified)。</p>
    </header>
    <article class="body">

      <section>
        <h2>UI Wireframe</h2>
        <div class="mock">
          <div class="topbar">
            <span class="dot" style="background:#FF5F57"></span>
            <span class="dot" style="background:#FEBC2E"></span>
            <span class="dot" style="background:#28C840"></span>
            <span class="url">/devloop/p-731042/ops/bugs</span>
          </div>
          <svg viewBox="0 0 1100 480" width="100%" role="img" aria-label="Buglist wireframe">
            <rect width="1100" height="480" fill="#FAF7F1"/>
            <rect x="0" y="0" width="1100" height="48" fill="#0E0E10"/>
            <text x="20" y="32" font-family="Fraunces" font-size="16" fill="#FAF7F1">Buglist · p-731042</text>
            <text x="900" y="32" font-family="JetBrains Mono" font-size="11" fill="#86827a" text-anchor="end">14 total · 3 open · 11 verified</text>

            <rect x="20" y="68" width="80" height="26" rx="13" fill="#fff" stroke="#0E0E10"/>
            <text x="60" y="85" font-family="JetBrains Mono" font-size="11" text-anchor="middle">all</text>
            <rect x="108" y="68" width="80" height="26" rx="13" fill="#FCE7E2" stroke="#C7341A"/>
            <text x="148" y="85" font-family="JetBrains Mono" font-size="11" text-anchor="middle" fill="#C7341A">open · 3</text>
            <rect x="196" y="68" width="80" height="26" rx="13" fill="#FFF6CC" stroke="#8a6b00"/>
            <text x="236" y="85" font-family="JetBrains Mono" font-size="11" text-anchor="middle" fill="#8a6b00">fixing · 1</text>
            <rect x="284" y="68" width="80" height="26" rx="13" fill="#E2F2EA" stroke="#0E8C5A"/>
            <text x="324" y="85" font-family="JetBrains Mono" font-size="11" text-anchor="middle" fill="#0E8C5A">verified · 11</text>
            <rect x="372" y="68" width="80" height="26" rx="13" fill="#EAEAEA" stroke="#666"/>
            <text x="412" y="85" font-family="JetBrains Mono" font-size="11" text-anchor="middle" fill="#666">wontfix · 0</text>

            <rect x="900" y="68" width="180" height="26" rx="4" fill="#fff" stroke="#dcd5c4"/>
            <text x="912" y="85" font-family="JetBrains Mono" font-size="10" fill="#6c6c6c">🔍 filter by unit / severity</text>

            <!-- Bug rows -->
            <rect x="20" y="110" width="1060" height="56" rx="6" fill="#fff" stroke="#dcd5c4"/>
            <rect x="20" y="110" width="4" height="56" fill="#C7341A"/>
            <text x="36" y="130" font-family="JetBrains Mono" font-size="11" fill="#C7341A" font-weight="700">open</text>
            <text x="100" y="130" font-family="JetBrains Mono" font-size="10" fill="#3B3B40">bug-..7f3a · auth-be · unit_test</text>
            <text x="36" y="152" font-family="Fraunces" font-size="14" fill="#0E0E10">login.invalid-pwd 期望 401 收 500</text>
            <text x="900" y="130" font-family="JetBrains Mono" font-size="10" fill="#6c6c6c" text-anchor="end">severity: high · 02 min ago</text>

            <rect x="20" y="172" width="1060" height="56" rx="6" fill="#fff" stroke="#dcd5c4"/>
            <rect x="20" y="172" width="4" height="56" fill="#8a6b00"/>
            <text x="36" y="192" font-family="JetBrains Mono" font-size="11" fill="#8a6b00" font-weight="700">fixing</text>
            <text x="100" y="192" font-family="JetBrains Mono" font-size="10" fill="#3B3B40">bug-..a91b · oauth-be · integration_test</text>
            <text x="36" y="214" font-family="Fraunces" font-size="14" fill="#0E0E10">callback 返回 500 而非 302</text>
            <text x="900" y="192" font-family="JetBrains Mono" font-size="10" fill="#6c6c6c" text-anchor="end">severity: critical · Coder retry 2/5</text>

            <rect x="20" y="234" width="1060" height="56" rx="6" fill="#fff" stroke="#dcd5c4"/>
            <rect x="20" y="234" width="4" height="56" fill="#0E8C5A"/>
            <text x="36" y="254" font-family="JetBrains Mono" font-size="11" fill="#0E8C5A" font-weight="700">verified</text>
            <text x="100" y="254" font-family="JetBrains Mono" font-size="10" fill="#3B3B40">bug-..3c4d · auth-fe · unit_test</text>
            <text x="36" y="276" font-family="Fraunces" font-size="14" fill="#0E0E10">login form 没处理空 email</text>
            <text x="900" y="254" font-family="JetBrains Mono" font-size="10" fill="#6c6c6c" text-anchor="end">severity: medium · L2 verified · 1h ago</text>

            <!-- Drill-down panel preview -->
            <text x="20" y="320" font-family="JetBrains Mono" font-size="10" fill="#3B3B40">点击展开:</text>
            <rect x="20" y="330" width="1060" height="130" rx="6" fill="#FAF7F1" stroke="#0E0E10"/>
            <text x="36" y="352" font-family="JetBrains Mono" font-size="11" fill="#0E0E10" font-weight="700">bug-..7f3a · STATUS TIMELINE</text>
            <text x="36" y="376" font-family="JetBrains Mono" font-size="10"><tspan fill="#C7341A">●</tspan> <tspan fill="#0E0E10">open</tspan> · 10:31:42 · tester · login.invalid-pwd</text>
            <text x="36" y="394" font-family="JetBrains Mono" font-size="10"><tspan fill="#8a6b00">●</tspan> <tspan fill="#0E0E10">fixing</tspan> · 10:32:08 · coder · retry attempt 2</text>
            <text x="36" y="412" font-family="JetBrains Mono" font-size="10" fill="#6c6c6c">  TypeError 修复:先查 user 再 bcrypt 比对</text>
            <text x="36" y="430" font-family="JetBrains Mono" font-size="10"><tspan fill="#0E8C5A">●</tspan> <tspan fill="#6c6c6c">fixed (pending)</tspan> · waiting Tester run</text>
            <text x="36" y="448" font-family="JetBrains Mono" font-size="10"><tspan fill="#0E8C5A">○</tspan> verified · waiting L2 integration</text>
          </svg>
        </div>
      </section>

      <section>
        <h2>过滤与分组</h2>
        <table class="dense">
          <thead><tr><th>维度</th><th>取值</th><th>说明</th></tr></thead>
          <tbody>
            <tr><td>status</td><td>open / fixing / fixed / verified / wontfix / duplicate</td><td>顶部 chip 选择,多选 OR</td></tr>
            <tr><td>severity</td><td>critical / high / medium / low</td><td>右上 filter</td></tr>
            <tr><td>unit_id</td><td>从 units.json 列表</td><td>右上 filter,下拉</td></tr>
            <tr><td>source</td><td>unit_test / integration_test / triage / human</td><td>filter</td></tr>
            <tr><td>since</td><td>时间窗口</td><td>filter(默认全部)</td></tr>
          </tbody>
        </table>
        <p>排序默认按 discovered_at 倒序,可切「未结束优先」(open + fixing 顶置)。</p>
      </section>

      <section>
        <h2>数据来源</h2>
        <p>本页是 <code>bugs.ndjson</code> 的纯<b>视图</b>,不写入。所有操作通过:</p>
        <table class="dense">
          <thead><tr><th>用户动作</th><th>触发的 API</th></tr></thead>
          <tbody>
            <tr><td>列表显示</td><td>GET /api/devloop/projects/:pid/bugs(内部调 <code>bugTracker.list</code>)</td></tr>
            <tr><td>点击展开</td><td>GET /api/devloop/projects/:pid/bugs/:id/history</td></tr>
            <tr><td>人类标 wontfix</td><td>POST .../bugs/:id/transition body=&#123;to:'wontfix',note&#125;</td></tr>
            <tr><td>人类合并 duplicate</td><td>POST .../bugs/:id/transition body=&#123;to:'duplicate',duplicate_of&#125;</td></tr>
          </tbody>
        </table>
      </section>

      <section>
        <h2>状态机参考</h2>
        <p>完整流转规则见 <a href="sdd-process.html">P-9 · Bug 状态机</a>。本页 UI 必须严格按状态机渲染:非法转换按钮 disabled。</p>
      </section>

      <section>
        <h2>关联视图</h2>
        <ul>
          <li>点击 unit_id chip → 跳到 <a href="proto-unit-drawer.html">UnitDrawer</a> 看该 Unit 详情</li>
          <li>点击 run_id → 跳到对应 result.json 内嵌视图</li>
          <li>点击 fix_refs 中的 run_id → 看修复时的 Tester 跑分</li>
          <li>右上「↗ 时间线」→ 跳 <a href="ops-loop-log.html">Loop Log</a></li>
        </ul>
      </section>

    </article>
    <nav class="prev-next"></nav>
    <footer class="site"><div><b>Section</b>07 · Ops</div><div><b>Page</b>ops-buglist.html</div></footer>
  </main>
</div>
<script src="assets/shell.js"></script>
</body>
</html>