# BUG 专项逐行走读 — Batch 1（2026-06-04）

**标准**: `docs/project/line-walk-audit-standard.md` · 八类仅列 **BUG**

## 范围（5 文件，全文 Read）

| 文件 | N | Read |
|------|---|------|
| `server/api/install.py` | 719 | 1–719 |
| `web/app/install.html` | 720 | createAdmin/lock 段 + init |
| `server/application/services/script_job_callback.py` | 110 | 1–110 |
| `server/api/agent.py` | 360 | 1–360 |
| `server/api/servers.py` | 1733 | stats 228–280 + list 165–220 |

---

## Step 3 规则扫描（BUG 相关）

| 文件 | 命中 |
|------|------|
| install.py | 守卫分支、lock/create-admin 时序 |
| install.html | 未检查 lock 响应 |
| script_job_callback.py | `_aggregate_execution_status` 空列表 |
| agent.py | 丢弃未知 server、指标解析 |
| servers.py | stats `offline = total - online` |

---

## Closure 表（BUG）

| 文件 | 行号 | 判定 | 严重度 | 理由 |
|------|------|------|--------|------|
| install.html | 691-694 | **FINDING** | P1 | create-admin 成功后未检查 `/lock`；失败仍进 step5 |
| install.py | 648 | **FINDING** | P1 | create-admin 与 lock 非原子；锁定前 install API 仍可被未认证调用 |
| script_job_callback.py | 17-36 | **FINDING** | P2 | `server_ids==[]` 时直接 `return "completed"`，忽略 results 中 pending |
| install.py | 509-526 | SAFE | — | state 不写 db_pass（有意）；刷新 step4 需重填密码属 UX |
| agent.py | 154-180 | SAFE | — | 无 server_id / 未知 server 丢弃，设计如此 |
| agent.py | 86-94 | SAFE | — | 非数字指标跳过 |
| servers.py | 245-279 | RISK/BUG | P2 | `offline=total-online` 与列表 Redis 覆盖逻辑在「从未装 Agent」服务器上可能偏差；非回归 |
| servers.py | 205-212 | SAFE | — | is_online 过滤后重算 total |

---

## FINDING 列表（8 字段）

### BUG-06-04-01 · P1 · install.html:691-694

**现象**：管理员创建成功但 lock 503/400 时 UI 仍显示「安装完成」。

**修复**：检查 lock 响应；`create-admin` 返回 `locked:true` 时跳过二次 lock。

### BUG-06-04-02 · P1 · install.py:648

**现象**：create-admin 完成到 lock 之间，未认证客户端可再次 `create-admin`（ON DUPLICATE 改密）。

**修复**：`create-admin` 末尾 `_finalize_install_lock()`；`lock` 幂等 `already_locked`。

### BUG-06-04-03 · P2 · script_job_callback.py:32-33

**现象**：`server_ids` JSON 损坏为空列表时，误标 `completed`。

**修复**：空列表时扫描 results 是否仍有 `phase=pending`。

---

## Step 7 统计

```
install.py              2 FINDING（已修）
install.html            1 FINDING（已修）
script_job_callback.py  1 FINDING（已修）
agent.py                0
servers.py              0（1 项 P2 观察）
```

## Step 8 DoD

- [x] 5 文件 Read 覆盖
- [x] Closure 全表
- [x] FINDING 含 `文件:行号`
- [x] 3 项 P1/P2 已落地修复

## 验证

```bash
ruff check server/api/install.py server/application/services/script_job_callback.py
pytest tests/test_security_unit.py tests/ -q --tb=no
```

Changelog: `docs/changelog/2026-06-04-install-lock-atomic.md`

## 下一批（BUG）

- `server/application/services/sync_engine_v2.py`
- `server/api/auth_service.py`
- `server/background/schedule_runner.py`
- `frontend/src/composables/terminal/useTerminalSessions.ts`
- `server/infrastructure/redis/script_execution_store.py`
