# Bug Scan Line-Walk 合并卷

> 生成日期: 2026-06-04 · 源文件 74 篇 · 原文 `docs/archive/audits/2026-06-04-line-walk/`

## 批次索引

### `audit-bug-line-walk-2026-06-04-batch1.md`

# BUG 专项逐行走读 — Batch 1（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## 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 |
## FINDING 列表（8 字段）
### BUG-06-04-01 · P1 · install.html:691-694
### BUG-06-04-02 · P1 · install.py:648
### BUG-06-04-03 · P2 · script_job_callback.py:32-33
## Step 7 统计

### `audit-bug-line-walk-2026-06-04-batch10.md`

# BUG 专项逐行走读 — Batch 10（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch11.md`

# BUG 专项逐行走读 — Batch 11（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch12.md`

# BUG 专项逐行走读 — Batch 12（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch13.md`

# BUG 专项逐行走读 — Batch 13（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch14.md`

# BUG 专项逐行走读 — Batch 14（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch17.md`

# BUG 专项逐行走读 — Batch 17（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch18.md`

# BUG 专项逐行走读 — Batch 18（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch19.md`

# BUG 专项逐行走读 — Batch 19（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch2.md`

# BUG 专项逐行走读 — Batch 2（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## Closure 表（BUG）
| schedule_runner.py | 125-217 | **FINDING** | P1 | `run_mode=once` 执行前禁用；失败时仅 cron 回滚 `last_run_at`，once 永久失活 |
## FINDING 列表（8 字段）
### BUG-06-04-04 · P1 · schedule_runner.py:212-217
## Step 7 统计
schedule_runner.py           1 FINDING（已修）
## Step 8 DoD
- [x] Closure 全表
- [x] FINDING 含 `文件:行号`

### `audit-bug-line-walk-2026-06-04-batch20.md`

# BUG 专项逐行走读 — Batch 20（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch21.md`

# BUG 专项逐行走读 — Batch 21（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch22.md`

# BUG 专项逐行走读 — Batch 22（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch23.md`

# BUG 专项逐行走读 — Batch 23（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch24.md`

# BUG 专项逐行走读 — Batch 24（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch25.md`

# BUG 专项逐行走读 — Batch 25（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch26.md`

# BUG 专项逐行走读 — Batch 26（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch27.md`

# BUG 专项逐行走读 — Batch 27（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch28.md`

# BUG 专项逐行走读 — Batch 28（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch29.md`

# BUG 专项逐行走读 — Batch 29（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch3.md`

# BUG 专项逐行走读 — Batch 3（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## Closure 表（BUG）
| retry_runner.py | 85-100 | **FINDING** | P2 | 仅 `failed==0 && completed>0` 成功；全 cancel 时 job 永久 pending |
| sync_engine_v2.py | 241-242 | **FINDING** | P2 | 任务异常时 `results` 缺项，`failed+completed` 可小于 `total` |
| servers.py | 276-279 | **FINDING** | P2 | Redis heartbeat 数可大于 DB `total`，在线率 >100% |
## FINDING 列表
### BUG-06-04-05 · P2 · retry_runner.py
### BUG-06-04-06 · P2 · sync_engine_v2.py:241-242
### BUG-06-04-07 · P2 · servers.py:276-279
## Step 7 统计

### `audit-bug-line-walk-2026-06-04-batch30.md`

# BUG 专项逐行走读 — Batch 30（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch31.md`

# BUG 专项逐行走读 — Batch 31（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch32.md`

# BUG 专项逐行走读 — Batch 32（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch33.md`

# BUG 专项逐行走读 — Batch 33（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch35.md`

# BUG 专项逐行走读 — Batch 35（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch36.md`

# BUG 专项逐行走读 — Batch 36（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch37.md`

# BUG 专项逐行走读 — Batch 37（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch38.md`

# BUG 专项逐行走读 — Batch 38（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch39.md`

# BUG 专项逐行走读 — Batch 39（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch4.md`

# BUG 专项逐行走读 — Batch 4（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## Closure 表（BUG）
| usePushProgress.ts | 184-194 | **FINDING** | P1 | POST 阻塞至推送结束才连 WS，进度事件全部丢失 |
| sync_v2.py | 125-182 | **FINDING** | P2 | 远程 file-ops 后未 `invalidate_browse_cache`，304 陈旧目录 |
| heartbeat_flush.py | 57-89 | **FINDING** | P2 | 每服务器独立 session/commit；已删服务器仍计 flushed |
## FINDING 列表
### BUG-06-04-08 · P1 · usePushProgress.ts
### BUG-06-04-09 · P2 · sync_v2 file-ops
### BUG-06-04-10 · P2 · heartbeat_flush.py
## Step 7 统计

### `audit-bug-line-walk-2026-06-04-batch40.md`

# BUG 专项逐行走读 — Batch 40（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch41.md`

# BUG 专项逐行走读 — Batch 41（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch42.md`

# BUG 专项逐行走读 — Batch 42（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch43.md`

# BUG 专项逐行走读 — Batch 43（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch44.md`

# BUG 专项逐行走读 — Batch 44（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch45.md`

# BUG 专项逐行走读 — Batch 45（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch46.md`

# BUG 专项逐行走读 — Batch 46（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch47.md`

# BUG 专项逐行走读 — Batch 47（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch48.md`

# BUG 专项逐行走读 — Batch 48（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch49.md`

# BUG 专项逐行走读 — Batch 49（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch5.md`

# BUG 专项逐行走读 — Batch 5（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## Closure 表（BUG）
| agent.py | 34, 226-227 | **FINDING** | P2 | 注释写 TTL=1.5×flush，实际 600=600，停 Agent 后 key 可能在 flush 前过期 |
| sync_v2.py | 1474-1650 | **FINDING** | P2 | write/chmod/compress/decompress 未失效 browse ETag（Batch4 已覆盖 ops/upload） |
## FINDING 列表
### BUG-06-04-11 · P2 · agent.py REDIS_KEY_EXPIRE
### BUG-06-04-12 · P2 · sync_v2 远程写路径
## Step 7 统计
agent.py                  1 FINDING（已修）
sync_v2.py                1 FINDING（已修）

### `audit-bug-line-walk-2026-06-04-batch50.md`

# BUG 专项逐行走读 — Batch 50（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch51.md`

# BUG 专项逐行走读 — Batch 51（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch52.md`

# BUG 专项逐行走读 — Batch 52（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch53.md`

# BUG 专项逐行走读 — Batch 53（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch54.md`

# BUG 专项逐行走读 — Batch 54（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch55.md`

# BUG 专项逐行走读 — Batch 55（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch56.md`

# BUG 专项逐行走读 — Batch 56（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch57.md`

# BUG 专项逐行走读 — Batch 57（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch58.md`

# BUG 专项逐行走读 — Batch 58（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch59.md`

# BUG 专项逐行走读 — Batch 59（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch6.md`

# BUG 专项逐行走读 — Batch 6（2026-06-04）
## 范围（5 文件，全文 Read）
## Step 3 规则扫描（BUG 相关）
## Closure 表（BUG）
| auth_service.py | 239-246 | **FINDING** | P1 | 已轮换 refresh 不在 Redis 时仅 401，不升 `token_version`，被盗旧 token 与合法新会话可并存 |
| auth_service.py | 597-598 | **FINDING** | P2 | Redis 异常时 `_check_refresh_token` 曾返回 False，误拒合法刷新 |
| useFilesBrowse.ts | 187-195 | **FINDING** | P2 | 5s 内命中本地缓存直接 return，跳过后端 ETag，变更后仍显示旧列表 |
## FINDING 列表
### BUG-06-04-13 · P1 · auth_service refresh 重用
### BUG-06-04-14 · P2 · auth Redis 不可用
### BUG-06-04-15 · P2 · useFilesBrowse 本地缓存短路
## Step 7 统计

### `audit-bug-line-walk-2026-06-04-batch60.md`

# BUG 专项逐行走读 — Batch 60（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch61.md`

# BUG 专项逐行走读 — Batch 61（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch62.md`

# BUG 专项逐行走读 — Batch 62（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch63.md`

# BUG 专项逐行走读 — Batch 63（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch64.md`

# BUG 专项逐行走读 — Batch 64（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch65.md`

# BUG 专项逐行走读 — Batch 65（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch66.md`

# BUG 专项逐行走读 — Batch 66（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch67.md`

# BUG 专项逐行走读 — Batch 67（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch68.md`

# BUG 专项逐行走读 — Batch 68（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch69.md`

# BUG 专项逐行走读 — Batch 69（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch7.md`

# BUG 专项逐行走读 — Batch 7（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch70.md`

# BUG 专项逐行走读 — Batch 70（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch71.md`

# BUG 专项逐行走读 — Batch 71（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch72.md`

# BUG 专项逐行走读 — Batch 72（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch73.md`

# BUG 专项逐行走读 — Batch 73（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch74.md`

# BUG 专项逐行走读 — Batch 74（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch75.md`

# BUG 专项逐行走读 — Batch 75（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch76.md`

# BUG 专项逐行走读 — Batch 76（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch77.md`

# BUG 专项逐行走读 — Batch 77（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch8.md`

# BUG 专项逐行走读 — Batch 8（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

### `audit-bug-line-walk-2026-06-04-batch9.md`

# BUG 专项逐行走读 — Batch 9（2026-06-04）
## 范围
| 文件 | N | Read | H | FINDING |
## Step 3 规则扫描
自动化规则表 §四（PY/FE/SH）；每命中经 Closure。
## Closure 表
## Step 8 DoD
- [x] Closure 全表（含零命中说明）
- [x] FINDING: **0**（OPEN 须当批修或登记）
## 验证
## FINDING 列表
无（0 FINDING）。

## Closure 摘录（合并）

| 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 |
| 文件 | N | Read | H | FINDING |
| `server/api/assets.py` | 358 | 1..358 | 19 | 0 |
| `server/api/files.py` | 77 | 1..77 | 3 | 0 |
| `server/api/health.py` | 67 | 1..67 | 8 | 0 |
| `server/api/scripts.py` | 418 | 1..418 | 18 | 0 |
| `server/api/search.py` | 119 | 1..119 | 7 | 0 |
| `server/api/__init__.py` | 1 | 1..1 | 0 | 0 |
| `server/api/dependencies.py` | 180 | 1..180 | 0 | 0 |
| `server/api/remote_path_validation.py` | 33 | 1..33 | 0 | 0 |
| `server/api/schema_path_validators.py` | 59 | 1..59 | 1 | 0 |
| `server/api/schemas.py` | 641 | 1..641 | 2 | 0 |
| `server/api/install.py` | 722 | 1..722 | 45 | 0 |
| `server/api/agent.py` | 362 | 1..362 | 16 | 0 |
| `server/api/auth_jwt.py` | 275 | 1..275 | 6 | 0 |
| `server/application/services/script_service.py` | 713 | 1..713 | 18 | 0 |
| `server/application/services/sync_engine_v2.py` | 540 | 1..540 | 16 | 0 |
| `server/application/services/auth_service.py` | 640 | 1..640 | 13 | 0 |
| `frontend/src/composables/terminal/useTerminalSessions.ts` | 750 | connect/reconnect/WebSSH |
| `server/application/services/files_browse_service.py` | 167 | 1..167 | 6 | 0 |
| `server/application/services/script_job_callback.py` | 110 | 1..110 | 2 | 0 |
| `server/application/services/script_jobs.py` | 125 | 1..125 | 1 | 0 |
| `server/application/services/server_service.py` | 68 | 1..68 | 0 | 0 |
| `server/application/services/sync_service.py` | 43 | 1..43 | 1 | 0 |
| `server/application/__init__.py` | 1 | 1..1 | 0 | 0 |
| `server/application/services/__init__.py` | 8 | 1..8 | 0 | 0 |
| `server/background/heartbeat_flush.py` | 102 | 1..102 | 3 | 0 |
| `server/background/retry_runner.py` | 148 | 1..148 | 7 | 0 |
| `server/background/schedule_runner.py` | 236 | 1..236 | 6 | 0 |
| `server/background/script_execution_flush.py` | 45 | 1..45 | 0 | 0 |
| `server/background/self_monitor.py` | 108 | 1..108 | 2 | 0 |
| `server/background/__init__.py` | 7 | 1..7 | 0 | 0 |
| `server/background/ip_allowlist_refresh.py` | 99 | 1..99 | 1 | 0 |
| `server/background/upload_staging_cleanup.py` | 60 | 1..60 | 0 | 0 |
| `server/__init__.py` | 5 | 1..5 | 0 | 0 |
| `server/config.py` | 217 | 1..217 | 3 | 0 |
| `server/main.py` | 669 | 1..669 | 21 | 0 |
| `server/infrastructure/database/__init__.py` | 1 | 1..1 | 0 | 0 |
| `server/infrastructure/database/admin_repo.py` | 62 | 1..62 | 4 | 0 |
| `server/infrastructure/database/audit_log_repo.py` | 86 | 1..86 | 5 | 0 |
| `server/infrastructure/database/crypto.py` | 54 | 1..54 | 0 | 0 |
| `server/infrastructure/database/db_credential_repo.py` | 38 | 1..38 | 2 | 0 |
| `server/infrastructure/database/engine_compat.py` | 23 | 1..23 | 0 | 0 |
| `server/infrastructure/database/migrations.py` | 180 | 1..180 | 6 | 0 |
| `server/infrastructure/database/password_preset_repo.py` | 38 | 1..38 | 2 | 0 |
| `server/infrastructure/database/platform_node_repo.py` | 83 | 1..83 | 7 | 0 |
| `server/infrastructure/database/push_schedule_repo.py` | 95 | 1..95 | 6 | 0 |
| `server/infrastructure/database/script_repo.py` | 90 | 1..90 | 8 | 0 |
| `server/infrastructure/database/server_repo.py` | 144 | 1..144 | 8 | 0 |
| `server/infrastructure/database/session.py` | 125 | 1..125 | 6 | 0 |
| `server/infrastructure/database/setting_repo.py` | 31 | 1..31 | 5 | 0 |
| `server/infrastructure/database/ssh_key_preset_repo.py` | 38 | 1..38 | 2 | 0 |
| `server/infrastructure/database/ssh_session_repo.py` | 83 | 1..83 | 6 | 0 |
| `server/infrastructure/database/sync_log_repo.py` | 120 | 1..120 | 6 | 0 |
| `server/infrastructure/ssh/__init__.py` | 1 | 1..1 | 0 | 0 |
| `server/infrastructure/ssh/asyncssh_pool.py` | 437 | 1..437 | 43 | 0 |
| `server/infrastructure/ssh/files_capability.py` | 62 | 1..62 | 3 | 0 |
| `server/infrastructure/ssh/remote_archive.py` | 128 | 1..128 | 2 | 0 |
| `server/infrastructure/ssh/remote_probe.py` | 85 | 1..85 | 5 | 0 |
| files_browse_service.py | 路径 `..`、SSH 命令引用 |
| servers.py | `offline = total - online`、Redis 脏 key |
| DashboardPage.vue | 是否混用 stats / 列表在线 |
| sync_engine_v2.py | `gather(return_exceptions=True)` |
| `server/infrastructure/ssh/remote_shell.py` | 63 | 1..63 | 5 | 0 |
| `server/infrastructure/__init__.py` | 15 | 1..15 | 0 | 0 |
| `server/infrastructure/agent_url.py` | 11 | 1..11 | 0 | 0 |
| `server/infrastructure/redis/__init__.py` | 1 | 1..1 | 0 | 0 |
| `server/infrastructure/redis/client.py` | 97 | 1..97 | 0 | 0 |
| `server/infrastructure/redis/script_callback_rate.py` | 44 | 1..44 | 1 | 0 |
| `server/infrastructure/redis/script_execution_store.py` | 422 | 1..422 | 10 | 0 |
| `server/infrastructure/subscription_parser.py` | 121 | 1..121 | 0 | 0 |
| `server/infrastructure/telegram/__init__.py` | 222 | 1..222 | 0 | 0 |
| `server/domain/__init__.py` | 3 | 1..3 | 0 | 0 |
| `server/domain/models/__init__.py` | 431 | 1..431 | 0 | 0 |
| `server/domain/repositories/__init__.py` | 125 | 1..125 | 0 | 0 |
| `server/utils/files_chmod_policy.py` | 29 | 1..29 | 0 | 0 |
| `server/utils/files_elevation.py` | 55 | 1..55 | 0 | 0 |
| `server/utils/posix_paths.py` | 122 | 1..122 | 2 | 0 |
| `server/utils/sync_error_message.py` | 72 | 1..72 | 0 | 0 |
| `server/utils/text_io.py` | 51 | 1..51 | 4 | 0 |
| `server/utils/unix_ls.py` | 115 | 1..115 | 1 | 0 |
| `frontend/src/pages/AlertsPage.vue` | 184 | 1..184 | 0 | 0 |
| `frontend/src/pages/AuditPage.vue` | 154 | 1..154 | 0 | 0 |
| `frontend/src/pages/CommandsPage.vue` | 164 | 1..164 | 0 | 0 |
| `frontend/src/pages/CredentialsPage.vue` | 390 | 1..390 | 0 | 0 |
| `frontend/src/pages/DashboardPage.vue` | 410 | 1..410 | 0 | 0 |
| `frontend/src/pages/FilesPage.vue` | 38 | 1..38 | 0 | 0 |
| `frontend/src/pages/LoginPage.vue` | 243 | 1..243 | 0 | 0 |
| `frontend/src/pages/PushPage.vue` | 106 | 1..106 | 0 | 0 |
| `frontend/src/pages/RetriesPage.vue` | 191 | 1..191 | 0 | 0 |
| `frontend/src/pages/SchedulesPage.vue` | 295 | 1..295 | 0 | 0 |
| `frontend/src/pages/ScriptsPage.vue` | 531 | 1..531 | 0 | 0 |
| `frontend/src/pages/ServersPage.vue` | 477 | 1..477 | 0 | 0 |
| `frontend/src/pages/SettingsPage.vue` | 434 | 1..434 | 0 | 0 |
| `frontend/src/pages/TerminalPage.vue` | 408 | 1..408 | 0 | 0 |
| `frontend/src/composables/terminal/useTerminalSessions.ts` | 749 | 1..749 | 0 | 0 |
| `frontend/src/composables/files/constants.ts` | 5 | 1..5 | 0 | 0 |
| `frontend/src/composables/files/filesPageContext.ts` | 21 | 1..21 | 0 | 0 |
| `frontend/src/composables/files/index.ts` | 9 | 1..9 | 0 | 0 |
| `frontend/src/composables/files/useFilesActions.ts` | 609 | 1..609 | 0 | 0 |
| `frontend/src/composables/files/useFilesBrowse.ts` | 267 | 1..267 | 0 | 0 |
| usePushProgress.ts | 184-194 | **FINDING** | P1 | POST 阻塞至推送结束才连 WS，进度事件全部丢失 |
| sync_v2.py | 125-182 | **FINDING** | P2 | 远程 file-ops 后未 `invalidate_browse_cache`，304 陈旧目录 |
| heartbeat_flush.py | 57-89 | **FINDING** | P2 | 每服务器独立 session/commit；已删服务器仍计 flushed |
| files.py | 39-77 | SAFE | — | 只读 browse；失效由 mutation 侧负责 |
| sync_v2.py | 73-90 | SAFE | — | 同步 API 本身无 ETag |
| `frontend/src/composables/files/useFilesEditor.ts` | 163 | 1..163 | 0 | 0 |
| `frontend/src/composables/files/useFilesNavigation.ts` | 210 | 1..210 | 0 | 0 |
| `frontend/src/composables/files/useFilesPage.ts` | 272 | 1..272 | 0 | 0 |
| `frontend/src/composables/files/useFilesPermissions.ts` | 101 | 1..101 | 0 | 0 |
| `frontend/src/composables/files/useFilesSelection.ts` | 28 | 1..28 | 0 | 0 |
| `frontend/src/composables/push/index.ts` | 3 | 1..3 | 0 | 0 |
| `frontend/src/composables/push/labels.ts` | 57 | 1..57 | 0 | 0 |
| `frontend/src/composables/push/types.ts` | 72 | 1..72 | 0 | 0 |
| `frontend/src/composables/push/usePushForm.ts` | 101 | 1..101 | 0 | 0 |
| `frontend/src/composables/push/usePushLogs.ts` | 146 | 1..146 | 0 | 0 |
| `frontend/src/composables/push/usePushPage.ts` | 40 | 1..40 | 0 | 0 |
| `frontend/src/composables/push/usePushPreview.ts` | 104 | 1..104 | 0 | 0 |
| `frontend/src/composables/push/usePushProgress.ts` | 288 | 1..288 | 0 | 0 |
| `frontend/src/composables/push/usePushServers.ts` | 115 | 1..115 | 0 | 0 |
| `frontend/src/composables/servers/useServerFormDialog.ts` | 255 | 1..255 | 0 | 0 |
| `frontend/src/composables/terminal/termNativeStore.ts` | 62 | 1..62 | 0 | 0 |
| `frontend/src/composables/terminal/types.ts` | 69 | 1..69 | 0 | 0 |
| `frontend/src/composables/terminal/useTerminalCmdBar.ts` | 108 | 1..108 | 0 | 0 |
| `frontend/src/composables/terminal/useTerminalSettings.ts` | 54 | 1..54 | 0 | 0 |
| `frontend/src/composables/useFilesClipboard.ts` | 91 | 1..91 | 0 | 0 |
| `frontend/src/composables/useFilesHotkeys.ts` | 79 | 1..79 | 0 | 0 |
| `frontend/src/composables/useFloatingPanel.ts` | 116 | 1..116 | 2 | 0 |
| `frontend/src/composables/useServerList.ts` | 38 | 1..38 | 0 | 0 |
| `frontend/src/composables/useServerPagination.ts` | 61 | 1..61 | 0 | 0 |
| `frontend/src/composables/useSnackbar.ts` | 13 | 1..13 | 0 | 0 |
| `frontend/src/composables/useTerminalQuickCommands.ts` | 73 | 1..73 | 0 | 0 |
| `frontend/src/composables/useWebSocket.ts` | 177 | 1..177 | 0 | 0 |
| `frontend/src/components/FileDirectoryTree.vue` | 316 | 1..316 | 0 | 0 |
| `frontend/src/components/FileEditorWorkbench.vue` | 1041 | 1..1041 | 0 | 0 |
| `frontend/src/components/FilePermissionDialog.vue` | 446 | 1..446 | 0 | 0 |
| `frontend/src/components/MonacoEditor.vue` | 254 | 1..254 | 0 | 0 |
| `frontend/src/components/ShellHighlightField.vue` | 200 | 1..200 | 1 | 0 |
| `frontend/src/components/StatCardsRow.vue` | 67 | 1..67 | 0 | 0 |
| `frontend/src/components/TerminalQuickCommandsSettings.vue` | 210 | 1..210 | 0 | 0 |
| `frontend/src/components/files/FilesBreadcrumb.vue` | 29 | 1..29 | 0 | 0 |
| `frontend/src/components/files/FilesDialogs.vue` | 180 | 1..180 | 0 | 0 |
| `frontend/src/components/files/FilesList.vue` | 279 | 1..279 | 0 | 0 |
| `frontend/src/components/files/FilesPermissionAlert.vue` | 35 | 1..35 | 0 | 0 |
| `frontend/src/components/files/FilesStatusBar.vue` | 24 | 1..24 | 0 | 0 |
| `frontend/src/components/files/FilesToolbar.vue` | 121 | 1..121 | 0 | 0 |
| `frontend/src/components/push/PushDiagnoseDialog.vue` | 71 | 1..71 | 0 | 0 |
| `frontend/src/components/push/PushHistoryTable.vue` | 139 | 1..139 | 0 | 0 |
| `frontend/src/components/push/PushPreviewDialog.vue` | 91 | 1..91 | 0 | 0 |
| `frontend/src/components/push/PushProgressList.vue` | 69 | 1..69 | 0 | 0 |
| `frontend/src/components/push/PushServerGrid.vue` | 110 | 1..110 | 0 | 0 |
| `frontend/src/components/push/PushSyncModeCard.vue` | 39 | 1..39 | 0 | 0 |
| `frontend/src/components/push/PushToolbar.vue` | 58 | 1..58 | 0 | 0 |
| agent.py | 34, 226-227 | **FINDING** | P2 | 注释写 TTL=1.5×flush，实际 600=600，停 Agent 后 key 可能在 flush 前过期 |
| sync_v2.py | 1474-1650 | **FINDING** | P2 | write/chmod/compress/decompress 未失效 browse ETag（Batch4 已覆盖 ops/upload） |
| heartbeat_flush.py | 18-20 | SAFE | — | 常量与 agent 对齐后由 agent 单一来源 |
| self_monitor.py | 102-107 | RISK | P3 | 原仅记录 alert WS；已补 sync WS 计数到 debug 日志 |
| files_browse_service.py | 65+ | SAFE | — | 新增 `invalidate_browse_parents` |
| `frontend/src/components/push/PushZipUpload.vue` | 51 | 1..51 | 0 | 0 |
| `frontend/src/components/servers/ServerFormDialog.vue` | 237 | 1..237 | 0 | 0 |
| `frontend/src/components/terminal/TerminalArea.vue` | 101 | 1..101 | 0 | 0 |
| `frontend/src/components/terminal/TerminalCmdBar.vue` | 109 | 1..109 | 0 | 0 |
| `frontend/src/components/terminal/TerminalQuickBar.vue` | 59 | 1..59 | 0 | 0 |
| `frontend/src/components/terminal/TerminalServerPicker.vue` | 86 | 1..86 | 0 | 0 |
| `frontend/src/components/terminal/TerminalTabBar.vue` | 66 | 1..66 | 0 | 0 |
| `frontend/src/components/terminal/TerminalToolbar.vue` | 108 | 1..108 | 0 | 0 |
| `frontend/src/App.vue` | 456 | 1..456 | 0 | 0 |
| `frontend/src/api/index.ts` | 308 | 1..308 | 2 | 0 |
| `frontend/src/router/index.ts` | 68 | 1..68 | 0 | 0 |
| `frontend/src/stores/auth.ts` | 132 | 1..132 | 0 | 0 |
| `frontend/src/stores/files.ts` | 129 | 1..129 | 0 | 0 |
| `frontend/src/monaco/initMonaco.ts` | 85 | 1..85 | 0 | 0 |
| `frontend/src/monaco/nexusThemes.ts` | 102 | 1..102 | 0 | 0 |
| `frontend/src/monaco/preloadMonaco.ts` | 30 | 1..30 | 0 | 0 |
| `frontend/src/monaco/setupMonacoEnv.ts` | 51 | 1..51 | 0 | 0 |
| `frontend/src/plugins/index.ts` | 19 | 1..19 | 0 | 0 |
| `frontend/src/plugins/vuetify.ts` | 20 | 1..20 | 0 | 0 |
| `frontend/src/styles/settings.scss` | 10 | 1..10 | 0 | 0 |
| `frontend/src/types/api.ts` | 256 | 1..256 | 0 | 0 |
| `frontend/src/types/global.d.ts` | 8 | 1..8 | 0 | 0 |
| `frontend/src/utils/apiError.ts` | 16 | 1..16 | 0 | 0 |
| `frontend/src/utils/auditLabels.ts` | 290 | 1..290 | 0 | 0 |
| `frontend/src/utils/auditNormalize.ts` | 23 | 1..23 | 0 | 0 |
| `frontend/src/utils/editorLanguage.ts` | 196 | 1..196 | 0 | 0 |
| `frontend/src/utils/fileBrowse.ts` | 61 | 1..61 | 0 | 0 |
| `frontend/src/utils/fileDownload.ts` | 12 | 1..12 | 0 | 0 |
| `frontend/src/utils/fileMode.ts` | 128 | 1..128 | 0 | 0 |
| `frontend/src/utils/filePreload.ts` | 141 | 1..141 | 0 | 0 |
| `frontend/src/utils/fileSort.ts` | 57 | 1..57 | 0 | 0 |
| `frontend/src/utils/pushErrorMessage.ts` | 65 | 1..65 | 0 | 0 |
| `frontend/src/utils/remotePath.ts` | 92 | 1..92 | 0 | 0 |
| `frontend/src/utils/serverSelection.ts` | 35 | 1..35 | 0 | 0 |
| `frontend/src/utils/shellHighlight.ts` | 196 | 1..196 | 0 | 0 |
| `frontend/src/utils/status.ts` | 35 | 1..35 | 0 | 0 |
| `frontend/src/utils/validation.ts` | 46 | 1..46 | 0 | 0 |
| `frontend/src/utils/wsUrl.ts` | 23 | 1..23 | 0 | 0 |
| `frontend/src/main.ts` | 28 | 1..28 | 0 | 0 |
| `web/app/api.js` | 214 | 1..214 | 11 | 0 |
| `web/app/index.html` | 14 | 1..14 | 0 | 0 |
| `web/app/install.html` | 730 | 1..730 | 6 | 0 |
| `web/app/layout.js` | 231 | 1..231 | 4 | 0 |
| `web/app/preview.html` | 183 | 1..183 | 0 | 0 |
| `web/agent/agent.py` | 434 | 1..434 | 26 | 0 |
| `web/agent/agent.sh` | 98 | 1..98 | 3 | 0 |
| `web/app/preview-v3.html` | 369 | 1..369 | 1 | 0 |
| `web/app/preview-v4.html` | 359 | 1..359 | 1 | 0 |
| `web/app/preview-v5.html` | 375 | 1..375 | 1 | 0 |
| auth_service.py | 239-246 | **FINDING** | P1 | 已轮换 refresh 不在 Redis 时仅 401，不升 `token_version`，被盗旧 token 与合法新会话可并存 |
| auth_service.py | 597-598 | **FINDING** | P2 | Redis 异常时 `_check_refresh_token` 曾返回 False，误拒合法刷新 |
| useFilesBrowse.ts | 187-195 | **FINDING** | P2 | 5s 内命中本地缓存直接 return，跳过后端 ETag，变更后仍显示旧列表 |
| auth_jwt.py | 217-226 | SAFE | — | `tv` 与 DB 严格比对 |
| script_execution_flush.py | 19-45 | SAFE | — | flush/stuck 分工清晰；`update_status` 内 commit |
| files.ts | 85-98 | SAFE | — | `invalidateCache` 与 mutation 联动 |
| `tests/__init__.py` | 0 | 1..0 | 0 | 0 |
| `tests/acceptance_catalog.py` | 64 | 1..64 | 0 | 0 |
| `tests/conftest.py` | 95 | 1..95 | 0 | 0 |
| `tests/load_test.py` | 201 | 1..201 | 20 | 0 |
| `tests/quick_load.py` | 86 | 1..86 | 9 | 0 |
| `web/agent/config.example.json` | 20 | 1..20 | 0 | 0 |
| `web/agent/install.sh` | 237 | 1..237 | 43 | 0 |
| `web/agent/uninstall.sh` | 115 | 1..115 | 20 | 0 |
| `tests/test_agent_heartbeat_ttl.py` | 9 | 1..9 | 1 | 0 |
| `tests/test_api.py` | 279 | 1..279 | 42 | 0 |
| `tests/test_auth_refresh_reuse.py` | 60 | 1..60 | 0 | 0 |
| `tests/test_editor_write_conflict.py` | 163 | 1..163 | 13 | 0 |
| `tests/test_file_permissions.py` | 75 | 1..75 | 0 | 0 |
| `tests/test_files_browse_etag.py` | 43 | 1..43 | 0 | 0 |
| `tests/test_files_elevation.py` | 109 | 1..109 | 10 | 0 |
| `tests/test_full_site_api.py` | 160 | 1..160 | 23 | 0 |
| `tests/test_nexus_v6.py` | 214 | 1..214 | 11 | 0 |
| `tests/test_posix_paths.py` | 62 | 1..62 | 0 | 0 |
| `tests/test_remote_path_validation.py` | 48 | 1..48 | 0 | 0 |
| `tests/test_retry_runner_outcome.py` | 58 | 1..58 | 0 | 0 |
| `tests/test_schedule_runner_once.py` | 21 | 1..21 | 0 | 0 |
| `tests/test_schema_path_validators.py` | 61 | 1..61 | 0 | 0 |
| `tests/test_security_unit.py` | 229 | 1..229 | 12 | 0 |
| `tests/test_step0_infrastructure.py` | 157 | 1..157 | 7 | 0 |
| `tests/test_step1to5_features.py` | 167 | 1..167 | 4 | 0 |
| `tests/test_sync_batch_id.py` | 24 | 1..24 | 0 | 0 |
| `tests/test_sync_error_message.py` | 39 | 1..39 | 0 | 0 |
| `tests/test_sync_websocket.py` | 44 | 1..44 | 1 | 0 |
| `tests/test_text_io.py` | 43 | 1..43 | 1 | 0 |
| `tests/test_unix_ls.py` | 21 | 1..21 | 0 | 0 |
| `tests/test_upload_staging_cleanup.py` | 64 | 1..64 | 1 | 0 |
| `deploy/check_shell_eol.sh` | 32 | 1..32 | 0 | 0 |
| `deploy/db_backup.sh` | 103 | 1..103 | 27 | 0 |
| `deploy/deploy-frontend.sh` | 60 | 1..60 | 3 | 0 |
| `deploy/gate_log.py` | 57 | 1..57 | 4 | 0 |
| `deploy/health_monitor.sh` | 70 | 1..70 | 14 | 0 |
| `deploy/install.sh` | 526 | 1..526 | 110 | 0 |
| `deploy/migrations/001_indexes.sql` | 24 | 1..24 | 0 | 0 |
| `deploy/nexus.conf` | 32 | 1..32 | 0 | 0 |
| `deploy/nginx_http.conf` | 79 | 1..79 | 0 | 0 |
| `deploy/nginx_https.conf` | 113 | 1..113 | 0 | 0 |
| `deploy/pre_deploy_check.sh` | 299 | 1..299 | 0 | 0 |
| `deploy/prune_frontend_assets.py` | 149 | 1..149 | 6 | 0 |
| `deploy/run_test_api_on_server.sh` | 6 | 1..6 | 0 | 0 |
| `deploy/uninstall.sh` | 145 | 1..145 | 23 | 0 |
| `deploy/upgrade.sh` | 130 | 1..130 | 22 | 0 |
| `deploy/verify_login.py` | 55 | 1..55 | 9 | 0 |
| `server/api/servers.py` | 1742 | 1..1742 | 68 | 0 |
| `scripts/_browse_test.py` | 37 | 1..37 | 8 | 0 |
| `scripts/bootstrap_database.py` | 118 | 1..118 | 13 | 0 |
| `scripts/cache-node20-windows.ps1` | 28 | 1..28 | 0 | 0 |
| `scripts/check_text_eol.py` | 111 | 1..111 | 11 | 0 |
| `scripts/check_worktree_eol.py` | 107 | 1..107 | 7 | 0 |
| `scripts/generate_bug_scan_registry.py` | 555 | 1..555 | 8 | 0 |
| `scripts/grant_nexus_local.sql` | 9 | 1..9 | 0 | 0 |
| `scripts/linux_mcp_mysql.sh` | 37 | 1..37 | 0 | 0 |
| `scripts/normalize_worktree_lf.sh` | 68 | 1..68 | 0 | 0 |
| `scripts/proxy-env.sh` | 16 | 1..16 | 0 | 0 |
| `scripts/proxychains-docker.conf` | 9 | 1..9 | 0 | 0 |
| `scripts/run_full_acceptance.sh` | 24 | 1..24 | 1 | 0 |
| `scripts/run_full_e2e.sh` | 13 | 1..13 | 1 | 0 |
| `scripts/run_nexus_acceptance.py` | 567 | 1..567 | 36 | 0 |
| `scripts/seed_local_admin.py` | 75 | 1..75 | 7 | 0 |
| `scripts/start-dev.sh` | 58 | 1..58 | 0 | 0 |
| `scripts/sync_frontend_vendor.py` | 180 | 1..180 | 18 | 0 |
| `scripts/sync_mysql_mcp_env.py` | 156 | 1..156 | 5 | 0 |
| `scripts/unlock_login_lockout.py` | 114 | 1..114 | 9 | 0 |
| `scripts/with-proxy.sh` | 9 | 1..9 | 0 | 0 |
| `scripts/wsl_check_mysql.py` | 66 | 1..66 | 13 | 0 |
| `scripts/wsl_ensure_venv.sh` | 19 | 1..19 | 7 | 0 |
| `scripts/wsl_install_node20.sh` | 117 | 1..117 | 1 | 0 |
| `scripts/wsl_integration_smoke.sh` | 76 | 1..76 | 7 | 0 |
| `scripts/wsl_mcp_mysql.sh` | 28 | 1..28 | 0 | 0 |
| `scripts/wsl_show_grants.py` | 45 | 1..45 | 6 | 0 |
| `scripts/wsl_start_dev.sh` | 21 | 1..21 | 2 | 0 |
| `.dockerignore` | 29 | 1..29 | 0 | 0 |
| `Dockerfile` | 29 | 1..29 | 0 | 0 |
| `docker/.env.example` | 18 | 1..18 | 0 | 0 |
| `docker/README.md` | 56 | 1..56 | 0 | 0 |
| `docker/entrypoint.sh` | 72 | 1..72 | 0 | 0 |
| `docker/generate_env.py` | 52 | 1..52 | 5 | 0 |
| `docker/sync_root_env.py` | 85 | 1..85 | 2 | 0 |
| `frontend/package.json` | 47 | 1..47 | 0 | 0 |
| `frontend/vite.config.mts` | 54 | 1..54 | 0 | 0 |
| `requirements-dev.txt` | 18 | 1..18 | 0 | 0 |
| `requirements.txt` | 18 | 1..18 | 0 | 0 |
| `ruff.toml` | 41 | 1..41 | 0 | 0 |
| `server/api/sync_v2.py` | 1666 | 1..1666 | 84 | 0 |
| `server/api/auth.py` | 375 | 1..375 | 14 | 0 |
| `server/api/settings.py` | 1396 | 1..1396 | 38 | 0 |
| `server/api/terminal.py` | 238 | 1..238 | 14 | 0 |
| `server/api/websocket.py` | 552 | 1..552 | 34 | 0 |
| `server/api/webssh.py` | 394 | 1..394 | 33 | 0 |
