# 审计 — 文件管理 chmod 不生效修复

## 范围（文件清单）

| 文件 | 变更 |
|------|------|
| `server/application/services/files_browse_service.py` | ETag 含 permissions/owner/group |
| `server/api/sync_v2.py` | chmod/chown 分步执行 |
| `frontend/src/components/FilePermissionDialog.vue` | 仅变更时提交 owner/group |
| `frontend/src/stores/files.ts` | 不继承旧 etag |
| `tests/test_files_browse_etag.py` | 权限变更 etag 测试 |

## Step 3 规则扫描

| H | 规则 | 结论 |
|---|------|------|
| H1 | 304 不返回过期权限 | PASS — ETag 含 permissions |
| H2 | chmod 不被 chown 连带失败 | PASS — 分步执行 |
| H3 | CUD 审计保留 | PASS — `_audit_sync` 未删 |

## Closure

| H | 判定 | 依据 |
|---|------|------|
| H1 | PASS | compute_browse_etag |
| H2 | PASS | sync_v2 chmod_file |
| H3 | PASS | audit_bits 仍在 |

## DoD

- [x] pytest 14 passed
- [x] type-check 通过
- [x] changelog

## 验证

文件页改 644→755 → 列表权限列更新；仅改 mode 不填 chown 时不发 owner 字段。
